今質問して思いついたのですが、例えばnum.a=1;num.b=2;num.c=3;のようにあらかじめ構造体で定義しておき、mem=num;としてもいいのかもしれません。 ですがこのmemは保存用の変数であってその前にいくつも処理があるため、構造体の変数よりも行列(ただの変数)で処理する方が実行が早くなると考え、あまりnumのような構造体を定義することには乗り気ではありません。 何とぞよろしくお願いいたします。
How to not to use “eval” function in my case(Japanese)
5 ビュー (過去 30 日間)
古いコメントを表示
お世話になっております。今、以下のコードを考えます。
a=1; b=2; c=3;
temp=["a","b","c"];
for k=1:3
mem.(temp(k))=eval(temp(k));
end
まず先に変数a,b,cを定義し、それと同じ名前をもつ構造体memをうまく定義する(このようにできることに気づいて感動しました)。それと同時に、構造体memに含まれるmem.XXという変数について、同じ名前の変数XXの値を代入する、という流れであります。なお自分の状況ではもっと変数が多いのですが、簡単のためこうしました。
ここでmatlabのヘルプや他のanswersを見ると"Eval is Evil !"と言われているほど嫌われている/非推奨なeval関数ですが、上のような状況だとevalを使わない形で実行できるのでしょうか?個人的にstringとして定義された文字"a"から、「値が1である変数の名前」aに結びつける方法が見つからなかったため、質問させていただいた次第です。
なお上の場合は
mem.a=a; mem.b=b; mem.c=c;
としてもいいのですが、実際には変数が数百あるためこれは厳しいと考えます(簡単にできる方法があるのでしょうか?)
よろしくお願いいたします。
3 件のコメント
採用された回答
Toru Ikegami
2021 年 7 月 19 日
編集済み: Toru Ikegami
2021 年 7 月 19 日
ご質問の本質からずれた回答かもしれませんが,一旦.mat ファイルに保存して,ロードするというのはいかがでしょう.
a = 1; b = 2; c = 3;
tmp = {'a','b','c'};
save('hogehoge.mat',tmp{:});
mem = load('hogehoge.mat')
2行目でセル配列に変数名を代入するところと,3行目の{:} で変数名をコンマ区切りリストに展開するあたりがミソでしょうか.
もちろん,ワークスペースにある変数全てを拾う場合には,単純にsaveコマンドとload コマンドを使えばOKです.ワークスペースを掃除して不要な変数を削除するのと,2行目のように変数名をセル配列に代入する式を書くのと,どちらか楽な方を選べばよいかと思います.
その他の回答 (1 件)
Hernia Baby
2021 年 7 月 17 日
編集済み: Hernia Baby
2021 年 7 月 17 日
一度cellに格納してから、上記のようなコードに組み込めば解決できると思います。
clc,clear,close all;
a=1; b=2; c=3;
ここでAというcell配列にそれぞれの数値を格納します。
A = {a,b,c};
temp=["a","b","c"];
lengthで繰り返しサイズを確認します。
num = length(temp);
それぞれのcell要素内の数字を当てはめていきます。
for k=1:num
mem.(temp(k))=A{k};
end
以下のように組み込まれます
mem
2 件のコメント
Hernia Baby
2021 年 7 月 17 日
cell配列のいいところは異なるデータ型も一切合切格納できる点です。
そして構造体に入れていくことでコンパクトにデータを授受できます。
以下に例を示します。
bを文字、cをベクトルにしてみましょう。
a=1;
b='HerniaBaby';
c=1:5;
A={a,b,c};
(小技)a~cを作るのが面倒な場合、以下のようなやり方があります。
temp = (""+char('a'+(0:length(A)-1)'))';
後は同じ処理です。
num = length(temp);
for k=1:num
mem.(temp(k))=A{k};
end
中身を見てみましょう
mem
参考
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!