Pode paralelo traversals ser feito em MATLAB como em Python?

votos
8

Usando a zipfunção, o Python permite loops para atravessar múltiplas sequências em paralelo.

for (x,y) in zip(List1, List2):

O MATLAB tem uma sintaxe equivalente? Se não, qual é a melhor maneira de interagir sobre duas matrizes paralelas ao mesmo tempo usando MATLAB?

Publicado 08/09/2008 em 09:25
fonte usuário
Em outras línguas...                            


6 respostas

votos
13

Se x e y são vetores coluna, você pode fazer:

for i=[x';y']
# do stuff with i(1) and i(2)
end

(com vetores linha, é só usar xe y).

Aqui está um exemplo de execução:

>> x=[1 ; 2; 3;]

x =

     1
     2
     3

>> y=[10 ; 20; 30;]

y =

    10
    20
    30

>> for i=[x';y']
disp(['size of i = ' num2str(size(i)) ', i(1) = ' num2str(i(1)) ', i(2) = ' num2str(i(2))])
end
size of i = 2  1, i(1) = 1, i(2) = 10
size of i = 2  1, i(1) = 2, i(2) = 20
size of i = 2  1, i(1) = 3, i(2) = 30
>> 
Respondeu 15/09/2008 em 20:20
fonte usuário

votos
5

Se não me engano a função zip você usar em python cria um par dos itens encontrados em list1 e list2 . Basicamente, ele ainda é um loop para com a adição que irá recuperar os dados das duas listas separadas para você, em vez que você tem que fazê-lo sozinho.

Então, talvez a sua melhor opção é usar um padrão para loop como este:

for i=1:length(a)
  c(i) = a(i) + b(i);
end

ou o que você tem que fazer com os dados.

Se você realmente está falando sobre computação paralela, em seguida, você deve dar uma olhada no Parallel Computing Toolbox para Matlab, e mais especificamente no parfor

Respondeu 08/09/2008 em 12:34
fonte usuário

votos
3

Testado apenas em oitava ... (sem licença Matlab). Variações de arrayfun () existir, verifique a documentação.

#!/usr/bin/octave -qf

function result = dostuff(my_ten, my_one)
  result = my_ten + my_one
endfunction

tens = [ 10 20 30 ];
ones = [ 1 2 3];

x = arrayfun(@dostuff, tens, ones);

x

Rendimentos...

x =

   11   22   33
Respondeu 09/09/2008 em 03:32
fonte usuário

votos
1

Eu recomendaria para unir as duas matrizes para o cálculo:

% assuming you have column vectors a and b
x = [a b];

for i = 1:length(a)
    % do stuff with one row...
    x(i,:);
end

Este será um grande trabalho se suas funções podem trabalhar com vetores. Então, novamente, muitas funções podem até mesmo trabalhar com matrizes, para que você não precisa mesmo o loop.

Respondeu 20/10/2008 em 15:22
fonte usuário

votos
0
for (x,y) in zip(List1, List2):

deve ser, por exemplo:

>> for row = {'string' 10
>>           'property' 100 }'
>>    fprintf([row{1,:} '%d\n'], row{2, :});
>> end
string10
property100

Isto é complicado porque a célula é mais do que 2x2, ea célula é ainda transposta. Por favor, tente isso.

E este é outro exemplo:

>> cStr = cell(1,10);cStr(:)={'string'};
>> cNum=cell(1,10);for cnt=1:10, cNum(cnt)={cnt};
>> for row = {cStr{:}; cNum{:}}
>>    fprintf([row{1,:} '%d\n'], row{2,:});
>> end
string1
string2
string3
string4
string5
string6
string7
string8
string9
string10
Respondeu 01/02/2019 em 15:52
fonte usuário

votos
-2

for loops em MATLAB costumava ser lento, mas isso não é mais verdade.

Então vectorizing nem sempre é a solução milagrosa. Basta usar o profiler e tice tocfunções para ajudar a identificar possíveis gargalos.

Respondeu 26/09/2008 em 12:31
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more