質問: MATLABのデータ読み書きについて
回答: 呼ばれて飛び出て...やめときましょう(笑) まず、今回のエラーの原因は2つあって、 ・str2doubleの仕様の確認不足 ・isemptyの使い方の勘違い です。つまり、両方私のミスです。 まずisemptyですが、これは入力が空の時真、空でない時偽です。 if isempty(tmp); だと「tmpが空の時」しか通らないので、 tline(i,1)=tmp; は一度も通ってないことになります。 まあアドバイスをするなら、dispを使っているのに一度も表示されていないと思うんで、そこで気づけるようになるとよいかもですね。 そして、 http://www.mathworks.co.jp/jp/help/matlab/ref/str2double.html?searc... を見ると、str2doubleは入力が有効な文字列でない場合、空ではなくNaNを返すようなので、 今回の分岐にはisemptyではなくisnanを使う必要があります。もちろん、「NaNでない時真」にしたいので isnan(tmp)ではなく~isnan(tmp) にする必要があります。 あといくつかアドバイスをするなら、 ・Cなどの経験のある方はループ変数にiを使いがちですが、Matlabでは(Octaveでも?)iを虚数単位として使用します。 混乱を避けるためにも、i,jは使わない方が賢明です。私はよくk,m,nあたりを使います。 ・tlineははじめにサイズを確保しておいた方が高速になります。120個程度であればそれほど差は感じられないと思いますが。 ・今回の書き方であった場合、例えばテキストファイルが 120 3.45 44A 234 ... となっていた場合、tlineは[120;3.45;0;234]となります。これは、 3行目は44Aでstr2doubleで数値に変換できない→ifの中を通らない 4行目は234でstr2doubleで数値に変換できる→tline(4,1)には234が入る と言う動作なのですが、3行目に何も入力してない状態で4行目に値を代入すると、3行目は自動的に0が入ります(初期化される、といってもいいかも知れません) これを防ぐには、 ・ループ変数とは別に変数cntを用意し、ifの中でcnt=cnt+1する ・if文にelseを追加して、その中でnanを代入しておく ・はじめからtlineをnanで初期化しておく などが考えられます。2つ目と3つ目に関しては、nanが入っている行を後で取り除けばよいです (tline=tline(~isnan(tline))) わからないこと等あればまた補足願います。 参考になれば幸いです。