Kan parallelt gjennomløping gjøres i MATLAB akkurat som i Python?

stemmer
8

Ved hjelp av zipfunksjon, gjør det mulig for Python sløyfer til å passere flere sekvenser i parallell.

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

Har MATLAB har en tilsvarende syntaks? Hvis ikke, hva er den beste måten å iterere over to parallelle rekker på samme tid ved hjelp av MATLAB?

Publisert på 08/09/2008 klokken 08:25
kilden bruker
På andre språk...                            


6 svar

stemmer
13

Hvis x og y er søylevektorer, kan du gjøre:

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

(med radvektorer, bare bruk xog y).

Her er et eksempel løp:

>> 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
>> 
Svarte 15/09/2008 kl. 19:20
kilden bruker

stemmer
5

Hvis jeg ikke tar feil zip-funksjonen du bruker i python skaper et par funnet i list1 og liste2 elementene . I utgangspunktet er det fortsatt en for løkke med tillegg at det vil hente data fra de to separate lister for deg, i stedet for at du må gjøre det selv.

Så kanskje det beste alternativet er å bruke en standard for løkke som dette:

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

eller hva du har å gjøre med dataene.

Hvis du virkelig snakker om parallell databehandling så bør du ta en titt på Parallel Computing Toolbox for Matlab, og mer spesifikt på parfor

Svarte 08/09/2008 kl. 11:34
kilden bruker

stemmer
3

Testet bare i oktav ... (ingen Matlab lisens). Varianter av arrayfun () eksisterer, sjekk dokumentasjonen.

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

Rentene ...

x =

   11   22   33
Svarte 09/09/2008 kl. 02:32
kilden bruker

stemmer
1

Jeg vil anbefale å bli med de to arrays for beregningen:

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

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

Dette vil fungere bra hvis funksjoner kan arbeide med vektorer. Så igjen, kan mange funksjoner også arbeide med matriser, så ville du ikke engang trenger loopen.

Svarte 20/10/2008 kl. 14:22
kilden bruker

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

bør være for eksempel:

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

Dette er vanskelig fordi cellen er mer enn 2x2, og cellen selv transponert. Vennligst prøv dette.

Og dette er et annet eksempel:

>> 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
Svarte 01/02/2019 kl. 15:52
kilden bruker

stemmer
-2

for løkker i MATLAB pleide å være treg, men dette er ikke sant lenger.

Så vectorizing er ikke alltid mirakel løsning. Bare bruk profiler, og ticog tocfunksjoner som hjelper deg med å identifisere mulige flaskehalser.

Svarte 26/09/2008 kl. 11:31
kilden bruker

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