2008-09-08 9 views

Respuesta

5

Si no me equivoco, la función zip que usa en python creates a pair of the items found in list1 and list2. Básicamente, sigue siendo un bucle for con la adición de que recuperará los datos de las dos listas separadas para usted, en lugar de eso usted debe hacerlo usted mismo.

Así que tal vez su mejor opción es utilizar un estándar para el bucle de esta manera:

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

o lo que usted tiene que hacer con los datos.

Si realmente está hablando de computación en paralelo, entonces debería echar un vistazo a la Parallel Computing Toolbox para MATLAB, y más específicamente a parfor

3

Probado sólo en la octava ... (sin licencia de Matlab). Existen variaciones de arrayfun(), verifique la documentación.

#!/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 

Los rendimientos ...

x = 

    11 22 33 
13

Si xey son vectores columna, que puede hacer:

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

(con vectores fila, sólo tiene que utilizar x y y).

Aquí se muestra un ejemplo de ejecución:

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

Por lo tanto, comprimir una lista con '(+)' y asignar el resultado a 'foo' se vería como' para i = [[1,2]; [3,4]] horzcat (foo, i (1) + i (2)) end'. Qué horrible D: Cuanto más me sumerjo en esto * (debido a una tarea de Coursera) *, más me sorprende lo torpe que es Matlab para los cálculos matemáticos. Esperaba algo así como Haskell con mutabilidad, resulta que definitivamente no lo es. –

-2

for bucles en MATLAB solían ser lento, pero esto ya no es cierto.

Así que la vectorización no siempre es la solución milagrosa. Solo use las funciones profiler y tic y toc para ayudarlo a identificar posibles cuellos de botella.

+1

debe ser "tic" y "toc" ... –

+1

de mi experiencia 'arrayfun' es * mucho * más lento que 'para', por ejemplo –

+1

Arrayfun no es vectorización, es solo un bucle de aspecto elegante. – Daniel

1

recomendaría para unir las dos matrices para el 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 

Esto funciona muy bien si sus funciones pueden trabajar con vectores. Por otra parte, muchas funciones incluso pueden funcionar con matrices, por lo que ni siquiera necesitaría el ciclo.

Cuestiones relacionadas