ここから本文です

MATLABのデータ読み書きについて

ash********さん

2013/11/2015:02:57

MATLABのデータ読み書きについて

以前回答していただいた者です。
その節はお世話になりました。

あれからいろいろと考えてみて、
120個の実数データが書かれたテキストファイル(cooling.txt)を読み込んで、
120行1列の配列に格納し、
それを別のテキスト(test.txt)に書き込むという相当単純なことをやろうとしているのですが、
これがうまくいきません。。。

fid = fopen('cooling.txt','rt');
fis = fopen('test.txt','wt');

for i = 1:120
tmp = str2double(fgetl(fid));
if isempty(tmp);
tline(i,1)=tmp;
disp(tline(i,1))
end;
end

for i = 1:120
fprintf(fis,'%10.5f\n',tline(i,1));
end

fclose(fid);
fclose(fis);

一応上記のプログラムを動かしてみたところ、

「関数'tline' (タイプ'double'の入力引数)が未定義です。
エラー Research (line 13)
fprintf(fis,'%10.5f\n',tline(i,1));」

となりました。
これはどこが問題なのでしょうか…?
formatのところなのかtlineと言っているので別なのか…

至極簡単なことだとは思いますが、
全然解決できなくて困っております。

またお知恵を頂戴したく思っております。
よろしくお願いいたします。

閲覧数:
2,673
回答数:
1
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

ona********さん

2013/11/2020:42:22

呼ばれて飛び出て…やめときましょう(笑)

まず、今回のエラーの原因は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)))

わからないこと等あればまた補足願います。

参考になれば幸いです。

質問した人からのコメント

2013/11/22 15:49:43

成功 なるほどちゃんとできました!
確かにdispで出なかったのはそういう観点からみてば気づくべきポイントでしたね。
今回も助かりました!
実は現時点ではあとひとつお聞きしたいことがあるのですが、
補足で聞くのも失礼ですので、
また後程、別に質問いたします。

あわせて知りたい

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる