web-dev-qa-db-ja.com

MATLABにforeachはありますか?その場合、基になるデータが変更された場合、どのように動作しますか?

MATLABにforeach構造はありますか?その場合、基礎となるデータが変更された場合(つまり、オブジェクトがセットに追加された場合)はどうなりますか?

164
Kip

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
144
Zach Scrivena

ザックは質問に対する直接的な答えについて正しいです。

興味深い副次的な注意点は、次の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のブログ を参照してください。

また、セル配列を反復処理できることに注意してください。

88
Mr Fooz

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
18
BHF

セル配列をループして、セル内の各要素に何かを適用しようとしている場合は、cellfunを確認してください。プログラムを簡素化するarrayfunbsxfun、およびstructfunもあります。

17
Loren

おお!きちんとした質問。

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
14
Jason S

文字列のセル配列を反復処理する場合、ループ変数(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]
7
ekorn

データの配列があるとしましょう:

n = [1    2   3   4   6   12  18  51  69  81  ]

次のように「foreach」できます:

for i = n, i, end

これにより、nのすべての要素がエコーされます(ただし、iをより興味深いものに置き換えることももちろん可能です!)

5
Skidder

私はこれがOPが本当に望んでいるものだと思う:

array = -1:0.1:10

for i=1:numel(array)
    disp(array(i))
end
4
tirth

今日(2月27日)、 MATLAB File Exchangeに新しいFor-Eachツールボックスがあります は、foreachの概念を実現します。 foreachはMATLAB言語の一部ではありませんが、このツールボックスを使用すると、foreachが行うことをエミュレートすることができます。

4
Dang Khoa