Existe uma estrutura foreach no MATLAB? Se sim, o que acontece se os dados subjacentes forem alterados (ou seja, se objetos forem adicionados ao conjunto)?
O loop FOR do MATLAB é de natureza estática; você não pode modificar a variável de loop entre iterações, ao contrário da estrutura de loop for (inicialização; condição; incremento) em outros idiomas. Isso significa que o código a seguir 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ê deseja responder a alterações na estrutura de dados durante as iterações, um loop WHILE pode ser mais apropriado - você poderá testar a condição do loop a cada iteração e definir o valor da variável do loop ( s) como você deseja:
n = 10;
f = n;
while n > 1
n = n-1;
f = f*n;
end
disp(['n! = ' num2str(f)])
Aliás, o loop for-each em Java (e possivelmente em outras linguagens) produz um comportamento não especificado quando a estrutura de dados é modificada durante a iteração. Se você precisar modificar a estrutura de dados, use uma instância Iterator apropriada que permita a adição e remoção de elementos na coleção que você está iterando. A boa notícia é que o MATLAB suporta objetos Java, para que você possa fazer algo assim:
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
Undefined function or variable 'B'
.A
é um vetor de linha, não um vetor de coluna. SeA
for uma matriz, cada k será um vetor de coluna dessa matriz. Portanto, transponha (A'
) ou vectorize (A(:)'
) se necessário..m
arquivos.Zach está correto sobre a resposta direta à pergunta.
Uma observação interessante é que os dois loops a seguir não executam o mesmo:
O primeiro loop cria uma variável
i
escalar e a itera como um loop for C. Observe que se você modificari
no corpo do loop, o valor modificado será ignorado, como diz Zach. No segundo caso, o Matlab cria uma matriz de 10.000 elementos e, em seguida, percorre todos os elementos da matriz.O que isso significa é que
funciona, mas
não (porque este exigiria a alocação de memória infinita). Veja o blog de Loren para detalhes.
Observe também que você pode iterar sobre matrizes de células.
fonte
O MATLAB for loop basicamente permite uma enorme flexibilidade, incluindo opara cadafuncionalidade. Aqui estão alguns exemplos:
1) Definir índice inicial, incremental e final
2) Loop sobre vetor
3) Laço sobre a corda
4) Loop sobre uma matriz de células unidimensional
5) Loop sobre uma matriz de células bidimensional
6) Use nomes de campo de matrizes de estrutura
fonte
Se você estiver tentando fazer um loop sobre uma matriz de células e aplicar algo a cada elemento da célula, confira
cellfun
. Há tambémarrayfun
,bsxfun
estructfun
que pode simplificar o seu programa.fonte
ooh! questão pura.
O loop for do Matlab pega uma matriz como entrada e itera sobre suas colunas. O Matlab também lida com praticamente tudo por valor (sem passagem por referência), então eu esperaria que fosse necessário um instantâneo da entrada do loop for, tornando-o imutável.
Aqui está um exemplo que pode ajudar a ilustrar:
fonte
Ao iterar sobre matrizes de células de cadeias, a variável de loop (vamos chamá-lo
f
) se torna uma matriz de célula de elemento único. Ter que escrever emf{1}
qualquer lugar fica entediante, e modificar a variável de loop fornece uma solução limpa.fonte
Digamos que você tenha uma matriz de dados:
então você pode 'foreach' assim:
Isso ecoará todos os elementos em n (mas substituir o i por coisas mais interessantes também é possível, é claro!)
fonte
Eu acho que é isso que o OP realmente quer:
fonte
numel(array)
é o número de elementos na matriz. talvez você quis dizer1:numel(array)
?for i = -1:0.1:10; disp(i); end;
seria melhor?A partir de hoje (27 de fevereiro), há uma nova caixa de ferramentas For-Each no MATLAB File Exchange que cumpre o conceito de
foreach
.foreach
não faz parte da linguagem MATLAB, mas o uso dessa caixa de ferramentas nos permite imitar oforeach
que faria.fonte