MATLABにforeach構造はありますか?その場合、基礎となるデータが変更された場合(つまり、オブジェクトがセットに追加された場合)はどうなりますか?
MATLABのFORループは本質的に静的です。他の言語のfor(initialization; condition; increment)ループ構造とは異なり、反復間でループ変数を変更することはできません。つまり、次のコードは、Bの値に関係なく、常に1、2、3、4、5を出力します。
A = 1:5;
for i = A
A = B;
disp(i);
end
反復中にデータ構造の変更に応答できるようにしたい場合は、 WHILEループ 適切---繰り返しごとにループ条件をテストし、必要に応じてループ変数の値を設定できます。
n = 10;
f = n;
while n > 1
n = n-1;
f = f*n;
end
disp(['n! = ' num2str(f)])
ところで、for-eachループ Javaの場合 (および場合によっては他の言語)は、データ構造が繰り返し。データ構造を変更する必要がある場合は、適切なIteratorインスタンスを使用して、反復しているコレクション。幸いなことに、MATLABはJavaオブジェクトをサポートしているため、次のようなことができます。
A = Java.util.ArrayList();
A.add(1);
A.add(2);
A.add(3);
A.add(4);
A.add(5);
itr = A.listIterator();
while itr.hasNext()
k = itr.next();
disp(k);
% modify data structure while iterating
itr.remove();
itr.add(k);
end
ザックは質問に対する直接的な答えについて正しいです。
興味深い副次的な注意点は、次の2つのループは同じことを実行しないことです。
for i=1:10000
% do something
end
for i=[1:10000]
% do something
end
最初のループは、スカラーである変数i
を作成し、C forループのように繰り返します。 Zachが言うように、ループ本体のi
を変更すると、変更された値は無視されることに注意してください。 2番目のケースでは、Matlabは10k要素の配列を作成し、配列のすべての要素を調べます。
これが意味することは
for i=1:inf
% do something
end
動作しますが、
for i=[1:inf]
% do something
end
(これには無限のメモリを割り当てる必要があるため)詳細については、 Lorenのブログ を参照してください。
また、セル配列を反復処理できることに注意してください。
MATLAB for ループは、 foreach 機能を含め、基本的に非常に柔軟です。ここにいくつかの例があります:
1)開始、増分、終了インデックスを定義する
for test = 1:3:9
test
end
2)ベクトル上のループ
for test = [1, 3, 4]
test
end
3)ストリングオーバーループ
for test = 'hello'
test
end
4)1次元のセル配列のループ
for test = {'hello', 42, datestr(now) ,1:3}
test
end
5)2次元のセル配列のループ
for test = {'hello',42,datestr(now) ; 'world',43,datestr(now+1)}
test(1)
test(2)
disp('---')
end
6)構造体配列のフィールド名を使用する
s.a = 1:3 ; s.b = 10 ;
for test = fieldnames(s)'
s.(cell2mat(test))
end
セル配列をループして、セル内の各要素に何かを適用しようとしている場合は、cellfun
を確認してください。プログラムを簡素化するarrayfun
、bsxfun
、およびstructfun
もあります。
おお!きちんとした質問。
Matlabのforループは入力として行列を取り、その列で繰り返します。また、Matlabは実質的にすべてを値で処理するため(参照渡しなし)、forループの入力のスナップショットを取得して不変にすることを期待しています。
以下に例を示すのに役立つ例を示します。
>> A = zeros(4); A(:) = 1:16
A =
1 5 9 13
2 6 10 14
3 7 11 15
4 8 12 16
>> i = 1; for col = A; disp(col'); A(:,i) = i; i = i + 1; end;
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
>> A
A =
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4
文字列のセル配列を反復処理する場合、ループ変数(f
と呼びましょう)は単一要素のセル配列になります。 f{1}
をどこにでも書かなければならないのは退屈であり、ループ変数を変更することで問題を回避できます。
% This example transposes each field of a struct.
s.a = 1:3;
s.b = zeros(2,3);
s % a: [1 2 3]; b: [2x3 double]
for f = fieldnames(s)'
s.(f{1}) = s.(f{1})';
end
s % a: [3x1 double]; b: [3x2 double]
% Redefining f simplifies the indexing.
for f = fieldnames(s)'
f = f{1};
s.(f) = s.(f)';
end
s % back to a: [1 2 3]; b: [2x3 double]
データの配列があるとしましょう:
n = [1 2 3 4 6 12 18 51 69 81 ]
次のように「foreach」できます:
for i = n, i, end
これにより、nのすべての要素がエコーされます(ただし、iをより興味深いものに置き換えることももちろん可能です!)
私はこれがOPが本当に望んでいるものだと思う:
array = -1:0.1:10
for i=1:numel(array)
disp(array(i))
end
今日(2月27日)、 MATLAB File Exchangeに新しいFor-Eachツールボックスがあります は、foreach
の概念を実現します。 foreach
はMATLAB言語の一部ではありませんが、このツールボックスを使用すると、foreach
が行うことをエミュレートすることができます。