MATLABの変数を動的に使いたい

MATLABを使用しているのですが、forループ内の左辺の変数を動的に変えたい場合、どのような手段があるでしょうか?
例として、シンプルなプログラムで説明します。
例) 例えば、変数(2次元配列)が10000個ある場合に、for文を使用して、左辺を動的に変える事で、全ての二次元配列の指定したセルに1を足していくようなプログラムは可能でしょうか?
変数(Workspace内)
a1 %10x2の配列とします
a2
:
:
a10000
プログラム
for i=1:10000
a1(1,1) = a1(1,1) + 1;%この配列a1をa2,a3...へとループ内で変更したい
end

 Réponse acceptée

Hiroyuki Hishida
Hiroyuki Hishida le 8 Déc 2019

1 vote

こんいうイメージでしょうか?
for i=1:size_i
for j=1:size_y
X(i,j)= X(i,j) +1;
end
end
MATLABの特性を活かすなら、これでも良いかと。
for i=1:size_i*size_j
X(i) = X(i) +1;
end
さらには例えXがn次元だとしても、その要素に1を加算するのであれば、
X+1;
で良いです。MATLABによる行列演算については、先程のリンクから飛べますので、是非ごらんください。

6 commentaires

Aki
Aki le 8 Déc 2019
質問の意図が伝わっていないようです
a1(i,j)
のiとjは簡単に変えられるので良いのですが,
a1(i,j) =
から
a2(i,j) =
へと左辺の配列自体をforループの中で変えたいのです.
MATLABにポインタはないようですので,そこで悩んでいます.
Kenta
Kenta le 8 Déc 2019
clear;clc
a1=zeros(10,2);
a2=ones(10,2);
a3=ones(10,2)+1;
a4=ones(10,3)+2;
for i=1:4
exp1 = sprintf('a%d',i);
exp2 = '(1,1)=';
exp3 = '(1,1)';
exp=strcat(exp1,exp2,exp1,exp3,'+1',';');
eval(exp)
end
こんにちは、上のような感じでいかがでしょうか?
つまり、a1(1,1)に1を足して、a2(1,1)に1を足す...ということを繰り返す、というふうになっています。
いまは、(1,1)を対象としていますが、複数(例:それぞれの変数の(2,3)と(2,8))にしたい場合は、外にもう1つループを作れば可能と思います。
Aki
Aki le 8 Déc 2019
strcatとevalを使用することで,変数を変えることができるんですね.
sprintfは使用していたのですが,左辺には使用することができなくてとても困っておりました.
大変参考になりました.ありがとうございます.
Kenta
Kenta le 8 Déc 2019
返信ありがとうございます。解決し、よかったです。
いまは、(1,1)と1つの値しか変更してませんが、ここの「1」を変数として入力すれば
ほかの座標の値も変更可能です。またいろいろ試してみて、不備があればご連絡ください。よろしくお願いいたします。
Yoshio
Yoshio le 8 Déc 2019
変数としてcell配列を使っても良いなら、以下のような方法もあるかと思います。
clear
numArrays = 3;
A = cell(numArrays,1);
for n = 1:numArrays
A{n} = magic(n);
end
B = A;
for n = 1:numArrays
B{n}(1,1) = A{n}(1,1)+1;
end
A{:}
B{:}
ans =
1
ans =
1 3
4 2
ans =
8 1 6
3 5 7
4 9 2
ans =
2
ans =
2 3
4 2
ans =
9 1 6
3 5 7
4 9 2
Aki
Aki le 10 Déc 2019
このような方法もあるのですね
シンプルで良い方法ですね ありがとうございます

Connectez-vous pour commenter.

Plus de réponses (1)

Hiroyuki Hishida
Hiroyuki Hishida le 8 Déc 2019
Modifié(e) : Hiroyuki Hishida le 8 Déc 2019

2 votes

例えば、左辺を配列化してこういうのはどうでしょうか? MATLAB感の少ない書き方ではありますが、
var_tmp =初期化
for iter=1:1000
var_tmp(iter)=var_tmp(iter)+1;
end
MATLAB感を出すなら、for文なくして、そのまま+1で良いと思います。 MATALB環境の行列
よろしくお願いします

1 commentaire

Aki
Aki le 8 Déc 2019
素早い回答ありがとうございます.
扱いたい対象は2次元配列であったので,質問内容を編集しました.
複数の二次元行列を左辺に使用したい場合は,どのような手段があるでしょうか?
ご回答よろしくお願いします.

Connectez-vous pour commenter.

Catégories

En savoir plus sur ループと条件付きステートメント dans Centre d'aide et File Exchange

Produits

Version

R2017b

Community Treasure Hunt

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

Start Hunting!