Existe um foreach em MATLAB? Se sim, como ele se comporta, se as alterações de dados subjacentes?

StackOverflow https://stackoverflow.com/questions/408080

  •  03-07-2019
  •  | 
  •  

Pergunta

Existe uma estrutura foreach em MATLAB? Se assim for, o que acontece se as alterações de dados subjacentes (ou seja, se os objetos são adicionados ao conjunto)?

Foi útil?

Solução

MATLAB de FOR circuito é estático na natureza; você não pode modificar a variável de laço entre iterações, ao contrário do for (inicialização; condição; incremento) estrutura de loop em outros idiomas. Isto significa que o seguinte código sempre imprime 1, 2, 3, 4, 5, independentemente do valor de B.

A = 1:5;

for i = A
    A = B;
    disp(i);
end

Se você quer ser capaz de responder às mudanças na estrutura de dados durante as iterações, a enquanto circuito podem ser mais apropriado --- você vai ser capaz de testar a condição de loop em cada iteração, e defina o valor da variável de loop (s ) como desejar:

n = 10;
f = n;
while n > 1
    n = n-1;
    f = f*n;
end
disp(['n! = ' num2str(f)])

Aliás, o para-cada laço em Java (e possivelmente outras línguas) produz um comportamento não especificado quando a estrutura de dados é modificado durante a iteração. Se você precisar modificar a estrutura de dados, você deve usar um apropriado Iterator instância que permite a adição e remoção de elementos na coleção que você é a iteração. A boa notícia é que MATLAB suporta objetos Java, assim você pode fazer algo como isto:

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

Outras dicas

Zach está correto sobre a resposta direta à pergunta.

Uma nota interessante é que as duas voltas seguintes não executar o mesmo:

for i=1:10000
  % do something
end
for i=[1:10000]
  % do something
end

O primeiro laço cria um i variável que é um escalar e ele itera-lo como um C durante loop. Note que se você modificar i no corpo loop, o valor modificado será ignorado, como diz Zach. No segundo caso, Matlab cria uma matriz 10k-elemento, então ele caminha todos os elementos da matriz.

O que isto significa é que

for i=1:inf
  % do something
end

obras, mas

for i=[1:inf]
  % do something
end

não (porque este seria necessário alocar memória infinita). Consulte de Loren blog para mais informações.

Além disso, note que você pode iterar sobre matrizes celulares.

O MATLAB loop for basicamente permite grande flexibilidade, incluindo funcionalidade. Aqui alguns exemplos:

1) Definir começar, incremento e índice final

for test = 1:3:9
   test
end

2) loop sobre vector

for test = [1, 3, 4]
   test
end

3) loop sobre corda

for test = 'hello'
   test
end

4) ao longo de um laço unidimensional matriz de células

for test = {'hello', 42, datestr(now) ,1:3}
   test
end

5), volta sobre uma matriz bidimensional de células

for test = {'hello',42,datestr(now) ; 'world',43,datestr(now+1)}
   test(1)   
   test(2)
   disp('---')
end

6) Uso FIELDNAMES de matrizes de estrutura

s.a = 1:3 ; s.b = 10  ; 
for test = fieldnames(s)'
   s.(cell2mat(test))
end

Se você está tentando fazer um loop através de uma matriz de célula e aplicar algo para cada elemento na célula, veja cellfun. Há também arrayfun, bsxfun e structfun que pode simplificar o seu programa.

ooh! pura questão.

Matlab de loop leva uma matriz como entrada e repete as suas colunas. Matlab também lida com praticamente tudo por valor (sem passagem por referência) para que eu esperaria que leva um instantâneo de entrada de loop for por isso é imutável.

aqui está um exemplo que pode ajudar a ilustrar:

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

Quando iteração sobre matrizes celulares de cordas, a variável de contagem (chamemos-lhe f) torna-se uma matriz de células de elemento único. Ter que escrever f{1} em todos os lugares fica entediante, e modificando a variável de laço fornece uma solução limpa.

% 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]

Vamos dizer que você tem uma matriz de dados:

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

então você pode 'foreach' assim:

for i = n, i, end

Isto irá ecoar cada elemento n (mas substituindo o i com coisas mais interessante, também é possível, é claro!)

Eu acho que isso é o que o OP realmente quer:

array = -1:0.1:10

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

A partir de hoje (27 de fevereiro), há um novo Para -Cada caixa de ferramentas no arquivo MATLAB Troca que realiza o conceito de foreach. foreach não é uma parte da linguagem MATLAB mas o uso desta caixa de ferramentas nos dá a capacidade de imitar o que foreach faria.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top