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

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

댓글을 달려면 로그인하십시오.

채택된 답변

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

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Hernia Baby
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
mem = struct with fields:
a: 1 b: 2 c: 3
  댓글 수: 2
Hernia Baby
Hernia Baby 2021년 7월 17일
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 2021년 7월 21일
ご回答ありがとうございます。確かに解決できそうですね。 ただその場合、初めからセル行列Aのところで処理を終わっていい(そこからmemを作るのではなく、セル行列Aを変数memとして扱っていい)感じもしました。

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Whos에 대해 자세히 알아보기

제품


릴리스

R2021a

Community Treasure Hunt

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

Start Hunting!