変数名の一部をリストから抽出できないです

list = ["a", "b"];
X = [1 2 3 4 5 6 ];
strcat("TF_", list(1,1)) = cumsum(X);
と言うように変数名の一部をlist(string型)から取り出して使いたいのですが、string型は変数に設定できないので、以下のコードを試しました。
str2num(strcat("TF_", list(1,1)))= cumsum(X)
これでも同じく「string型の値をインデックスとして使用できません。」となってしまいます。どうすればできるようになるでしょうか?

 Akzeptierte Antwort

Atsushi Ueno
Atsushi Ueno am 6 Jul. 2021

2 Stimmen

list = ['a', 'b'];
X = [1 2 3 4 5 6 ];
eval(['TF_' list(1,1) '= cumsum(X);']);
のようにchar型文字とeval関数を使えば実現しますが、これは推奨されない方法です。英語で同じ質問をしたら、百戦錬磨のMATLABフリーク各位から電光石火のスピードで「プログラム内で動的な名前を作るんじゃない!!!」と怒られます。
関数 eval の代替方法 - MATLAB & Simulink - MathWorks 日本 :最初にあるセル配列を用いる例です
numArrays = 6;
TF = cell(numArrays,1);
for n = 1:numArrays
TF{n} = cumsum(X);
end

4 Kommentare

Atsushi Ueno
Atsushi Ueno am 6 Jul. 2021
string型でも同様に出来ます。しつこいですがこれは推奨されない方法です。
list = ["a", "b"];
X = [1 2 3 4 5 6 ];
eval(strcat("TF_", list(1,1), "= cumsum(X)"));
TF_a = 1×6
1 3 6 10 15 21
悠真 松本
悠真 松本 am 6 Jul. 2021
Atsushi Ueno様 迅速且つわかりやすい回答ありがとうございます。
 VBAやpythonでは同じようなことを普通に行っていましたが、どうしてMatlabだと推奨されないのか調べても出てきませんでした。動的に作った方がプログラムは短く書けると思うのですが。
Atsushi Ueno
Atsushi Ueno am 6 Jul. 2021
目下の課題(TF_aやTF_b等の名前を繰り返し処理で作成する)の達成の為ならevalを使えば良いかもしれませんが、引き続きプログラム中でTF_aやTF_b等の名前を使うにはやはりevalを使う必要があり、eval縛りから抜け出せなくなります。また、実行速度の低下、可読性の低下、デバッグのし難さなど欠点を上げればキリが有りません。マクロの多用と似ていて、他の言語でも同じ事が言えます。
悠真 松本
悠真 松本 am 7 Jul. 2021
なるほど、そういうことでしたか。今後何のプログラムを書くにしても気を付けます。ありがとうございます。

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Produkte

Version

R2021a

Community Treasure Hunt

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

Start Hunting!