Existe um foreach em MATLAB? Se sim, como ele se comporta, se as alterações de dados subjacentes?
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)?
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
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 foreach 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.