How to not to use “eval” function in my case(Japanese)
Show older comments
お世話になっております。今、以下のコードを考えます。
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;
としてもいいのですが、実際には変数が数百あるためこれは厳しいと考えます(簡単にできる方法があるのでしょうか?)
よろしくお願いいたします。
Accepted Answer
More Answers (1)
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
2 Comments
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
gafakel
on 21 Jul 2021
Categories
Find more on ループと条件付きステートメント in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!