Respostas:
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
A
é um vetor de linha, não um vetor de coluna. Se A
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:
for i=1:10000
% do something
end
for i=[1:10000]
% do something
end
O primeiro loop cria uma variável i
escalar e a itera como um loop for C. Observe que se você modificar i
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
for i=1:inf
% do something
end
funciona, mas
for i=[1:inf]
% do something
end
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.
O MATLAB for loop basicamente permite uma enorme flexibilidade, incluindo opara cadafuncionalidade. Aqui estão alguns exemplos:
1) Definir índice inicial, incremental e final
for test = 1:3:9
test
end
2) Loop sobre vetor
for test = [1, 3, 4]
test
end
3) Laço sobre a corda
for test = 'hello'
test
end
4) Loop sobre uma matriz de células unidimensional
for test = {'hello', 42, datestr(now) ,1:3}
test
end
5) Loop sobre uma matriz de células bidimensional
for test = {'hello',42,datestr(now) ; 'world',43,datestr(now+1)}
test(1)
test(2)
disp('---')
end
6) Use nomes de campo de matrizes de estrutura
s.a = 1:3 ; s.b = 10 ;
for test = fieldnames(s)'
s.(cell2mat(test))
end
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ém arrayfun
, bsxfun
e structfun
que pode simplificar o seu programa.
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:
>> 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
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 em f{1}
qualquer lugar fica entediante, e modificar a variável de loop 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]
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 o foreach
que faria.
Undefined function or variable 'B'
.