How to not to use “eval” function in my case(Japanese)
Mostrar comentarios más antiguos
お世話になっております。今、以下のコードを考えます。
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;
としてもいいのですが、実際には変数が数百あるためこれは厳しいと考えます(簡単にできる方法があるのでしょうか?)
よろしくお願いいたします。
Respuesta aceptada
Más respuestas (1)
Hernia Baby
el 17 de Jul. de 2021
Editada: Hernia Baby
el 17 de Jul. de 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 comentarios
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
el 21 de Jul. de 2021
Categorías
Más información sobre ループと条件付きステートメント en Centro de ayuda y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!