forループを扱うとき

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

Akzeptierte Antwort

Musashi Ito
Musashi Ito am 30 Mär. 2020
forループ内で名前が違うベクトルに対してループ内の変数に応じて処理を変更する場合は、まずは一つの変数にまとめる方法はいかがでしょうか。
・txt1,txt2,txt3, ... が数値ベクトルであれば、一列目に txt1、二列目に txt2、三列目に txt3、 ... の2次元の行列に連結して、一つの変数にまとめます。 その後に for 文で最初のループでは 一列目の全行 (txt1)を抽出して処理、二巡目のループでは二列目の全行 (txt2の部分) を抽出して処理する、結果は同じように行列にまとめるという具合にプログラムを作成すればできるかなと思います。
※ ベクトル内の要素を指定して、データを抽出する方法は以下のドキュメンテーションが参考になるかなと思います。
・txt1,txt2,txt3, ... が文字などのベクトルであれば、セル配列を扱えば、同じように連結して一つの配列の変数にまとめることができます。セル配列の作り方や抽出の方法は少し難しいので、以下のドキュメンテーションが参考になるかなと思います。
あとは、ループ内の順番に応じて処理を変更するのが一番シンプルな方法かなと思います。
  3 Kommentare
Keishi Chiba
Keishi Chiba am 31 Mär. 2020
Musashi Ito様
丁寧なご回答ありがとうございます.
配列の指定の仕方まで記載されておりとても助かります.
記述するための練習として,自分で試したのですが,目的どおりに記述できるような気がしてきました.
最初に解析に扱うデータを一つの変数にまとめるとのことですが,現在
data(0,:) = txt0(i,:);
data(1,:) = txt1(i,:);
data(2,:) = txt2(i,:);
のように,データ点数の数だけ記述して記述しています.この部分をforループ等に落とし込むにはToshinobu Shintai 様が仰るようにevalを使うしかないのでしょうか.
Musashi Ito
Musashi Ito am 31 Mär. 2020
はい、連番が含まれる名前の変数を for ループで順番に実行したい場合等は、eval 関数を使用するとできそうですね。
※ 行列の1行目を指定する場合は 0 ではなく 1 ですのでご注意下さい。
 NG : data(0,:)
 OK : data(1,:)
補足なのですが eval 関数を使用するときの注意点などもドキュメンテーションに記載されているみたいなので、参考になれば幸いです。
連番が含まれる名前の変数を作成する前に、配列等でうまく整理できると良いみたいですね。

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

Toshinobu Shintai
Toshinobu Shintai am 27 Mär. 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の()の中の文字列をコマンドウィンドウに貼り付けて実行する、ということをしていると思えば、理解は早いかと思います。

Kategorien

Mehr zu ループと条件付きステートメント finden Sie in Help Center und File Exchange

Produkte

Community Treasure Hunt

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

Start Hunting!