MATLAB Answers

forループを扱うとき

27 views (last 30 days)
Keishi Chiba
Keishi Chiba on 27 Mar 2020
Commented: Musashi Ito on 31 Mar 2020
ベクトルが
txt1
txt2
txt3
のように,20まであります.
このように沢山あるベクトルに対して,cfit関数を使用してカーブフィッティングを行い,そのピーク位置を算出するという処理を行おうとしています.
そこで,質問があります.forループ内で名前が違うベクトルに対して,ループ内の変数に応じて処理を変更する用に記述したいです.
ベクトル内の要素を指定したいときはtxt1[n]のような形で記述すれば良いかと思うのですが,複数のベクトルで一部だけ名前が違う場合はどのように記述すればよいのか分かりません.
初歩的な質問で大変申し訳ありませんが,お力を貸していただけると助かります.

  0 Comments

Sign in to comment.

Accepted Answer

Musashi Ito
Musashi Ito on 30 Mar 2020
forループ内で名前が違うベクトルに対してループ内の変数に応じて処理を変更する場合は、まずは一つの変数にまとめる方法はいかがでしょうか。
・txt1,txt2,txt3, ... が数値ベクトルであれば、一列目に txt1、二列目に txt2、三列目に txt3、 ... の2次元の行列に連結して、一つの変数にまとめます。 その後に for 文で最初のループでは 一列目の全行 (txt1)を抽出して処理、二巡目のループでは二列目の全行 (txt2の部分) を抽出して処理する、結果は同じように行列にまとめるという具合にプログラムを作成すればできるかなと思います。
※ ベクトル内の要素を指定して、データを抽出する方法は以下のドキュメンテーションが参考になるかなと思います。
・txt1,txt2,txt3, ... が文字などのベクトルであれば、セル配列を扱えば、同じように連結して一つの配列の変数にまとめることができます。セル配列の作り方や抽出の方法は少し難しいので、以下のドキュメンテーションが参考になるかなと思います。
あとは、ループ内の順番に応じて処理を変更するのが一番シンプルな方法かなと思います。

  3 Comments

Kenta
Kenta on 30 Mar 2020
こんにちは、私もMusashi Itoさまのアイデアが非常によいと思いました。
例えば画像の場合、1.jpg, 2.jpg, 3.jpg...のように保存されていたら、
for i=1:10
ImgName=sprintf('%d.jpg',i);
I=imread(ImgName);
end
として順次画像を読み込むことができます。
テキストファイルだと例えばcsvreadを使うときもあるかもしれません。うまく状況を汲み取れていないかもしれませんが、こちら、参考になれば幸いです。
Keishi Chiba
Keishi Chiba on 31 Mar 2020
Musashi Ito様
丁寧なご回答ありがとうございます.
配列の指定の仕方まで記載されておりとても助かります.
記述するための練習として,自分で試したのですが,目的どおりに記述できるような気がしてきました.
最初に解析に扱うデータを一つの変数にまとめるとのことですが,現在
data(0,:) = txt0(i,:);
data(1,:) = txt1(i,:);
data(2,:) = txt2(i,:);
のように,データ点数の数だけ記述して記述しています.この部分をforループ等に落とし込むにはToshinobu Shintai 様が仰るようにevalを使うしかないのでしょうか.
Musashi Ito
Musashi Ito on 31 Mar 2020
はい、連番が含まれる名前の変数を for ループで順番に実行したい場合等は、eval 関数を使用するとできそうですね。
※ 行列の1行目を指定する場合は 0 ではなく 1 ですのでご注意下さい。
 NG : data(0,:)
 OK : data(1,:)
補足なのですが eval 関数を使用するときの注意点などもドキュメンテーションに記載されているみたいなので、参考になれば幸いです。
連番が含まれる名前の変数を作成する前に、配列等でうまく整理できると良いみたいですね。

Sign in to comment.

More Answers (1)

Toshinobu Shintai
Toshinobu Shintai on 27 Mar 2020
そのような場合は「eval」を使うとできます。例えば、txt1からtxt20までの変数に順番に文字を格納したいときは、以下のようにすることができます。
%% Init
txt1 = 'a'; txt2 = 'a'; txt3 = 'a'; txt4 = 'a'; txt5 = 'a';
txt6 = 'a'; txt7 = 'a'; txt8 = 'a'; txt9 = 'a'; txt10 = 'a';
txt11 = 'a'; txt12 = 'a'; txt13 = 'a'; txt14 = 'a'; txt15 = 'a';
txt16 = 'a'; txt17 = 'a'; txt18 = 'a'; txt19 = 'a'; txt20 = 'a';
%% loop
%それぞれの変数にループ処理をする
for i = 1:20
eval(['txt', num2str(i), ' = ', char(39), char(96 + i), char(39)]);
end
evalの()の中の文字列をコマンドウィンドウに貼り付けて実行する、ということをしていると思えば、理解は早いかと思います。

  0 Comments

Sign in to comment.

Products

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!