How to not to use “eval” function in my case(Japanese)

8 views (last 30 days)
お世話になっております。今、以下のコードを考えます。
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 Comments
gafakel
gafakel on 21 Jul 2021
Edited: gafakel on 21 Jul 2021
ご回答いただきありがとうございます。 大変恐縮ですがどうしてこの質問をしたか失念した(この質問は自分が実際に使うプログラムでの状況を単純化したものなため、これのご回答をどうやって自分の環境に生かすのか完全に忘れてしまった)ため、しばらく時間をおいてから回答を採用させていただければと存じます。よろしくお願いいたします。 (あまり長いこと置いておくのは良くないはずなので、2・3日中には行おうと思います)
gafakel
gafakel on 4 Aug 2021
対応が遅くなり失礼いたしました。独断と偏見ですが、今回は「(動作は遅くなるものの)変数名の定義が少ない回数で済むので楽」という観点から回答を選ばせていただきました。 お二人とも、ご回答いただき誠にありがとうございました。

Sign in to comment.

Accepted Answer

Toru Ikegami
Toru Ikegami on 19 Jul 2021
Edited: Toru Ikegami on 19 Jul 2021
ご質問の本質からずれた回答かもしれませんが,一旦.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 Comment
gafakel
gafakel on 21 Jul 2021
ご回答ありがとうございます。一旦matファイルに保存するという発想はありませんでした。 確かにそこからロードしても良さそうです。ただこれをfor文で回すときに、いちいちsave,loadを動かすと重くなる感じもあります……。

Sign in to comment.

More Answers (1)

Hernia Baby
Hernia Baby on 17 Jul 2021
Edited: Hernia Baby on 17 Jul 2021
一度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
mem = struct with fields:
a: 1 b: 2 c: 3
  2 Comments
Hernia Baby
Hernia Baby on 17 Jul 2021
cell配列のいいところは異なるデータ型も一切合切格納できる点です。
そして構造体に入れていくことでコンパクトにデータを授受できます。
以下に例を示します。
bを文字、cをベクトルにしてみましょう。
a=1;
b='HerniaBaby';
c=1:5;
A={a,b,c};
(小技)a~cを作るのが面倒な場合、以下のようなやり方があります。
詳しくは こちらの小技2 を参照してみてください。
temp = (""+char('a'+(0:length(A)-1)'))';
後は同じ処理です。
num = length(temp);
for k=1:num
mem.(temp(k))=A{k};
end
中身を見てみましょう
mem
mem = struct with fields:
a: 1 b: 'HerniaBaby' c: [1 2 3 4 5]
gafakel
gafakel on 21 Jul 2021
ご回答ありがとうございます。確かに解決できそうですね。 ただその場合、初めからセル行列Aのところで処理を終わっていい(そこからmemを作るのではなく、セル行列Aを変数memとして扱っていい)感じもしました。

Sign in to comment.

Products


Release

R2021a

Community Treasure Hunt

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

Start Hunting!