Можно ли выполнять параллельные обходы в MATLAB так же, как в Python? - PullRequest
9 голосов
/ 08 сентября 2008

Используя функцию zip, Python позволяет циклам проходить параллельно несколько последовательностей.

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

Имеет ли MATLAB эквивалентный синтаксис? Если нет, то как лучше всего выполнять итерацию по двум параллельным массивам одновременно, используя MATLAB?

Ответы [ 6 ]

15 голосов
/ 15 сентября 2008

Если x и y - векторы столбцов, вы можете сделать:

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

(с векторными строками просто используйте x и y).

Вот пример запуска:

>> 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
>> 
6 голосов
/ 08 сентября 2008

Если я не ошибаюсь, функция zip, которую вы используете в python , создает пару элементов, найденных в list1 и list2 . По сути, это все еще цикл for с добавлением, что он будет извлекать данные из двух отдельных списков для вас, вместо этого вам придется делать это самостоятельно.

Так что, возможно, ваш лучший вариант - использовать стандарт для цикла следующим образом:

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

или что вы имеете отношение к данным.

Если вы действительно говорите о параллельных вычислениях, вам следует взглянуть на Parallel Computing Toolbox для matlab, а более конкретно на parfor

5 голосов
/ 09 сентября 2008

Проверено только в октаве ... (без лицензии Matlab). Существуют вариации arrayfun (), проверьте документацию.

dostuff = @(my_ten, my_one) my_ten + my_one;

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

x = arrayfun(dostuff, tens, ones);

x

Урожайность ...

x =

   11   22   33
1 голос
/ 20 октября 2008

Я бы рекомендовал объединить два массива для вычисления:

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

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

Это будет прекрасно работать, если ваши функции могут работать с векторами. Опять же, многие функции могут работать даже с матрицами, поэтому вам даже не понадобится цикл.

0 голосов
/ 01 февраля 2019
for (x,y) in zip(List1, List2):

должно быть, например:

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

Это сложно, потому что ячейка больше чем 2x2, и ячейка даже транспонирована Пожалуйста, попробуйте это.

И это еще один пример:

>> 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
0 голосов
/ 26 сентября 2008

for циклы в MATLAB были медленными, но это больше не так.

Так что векторизация не всегда является чудесным решением. Просто используйте профилировщик и функции tic и toc, чтобы помочь вам определить возможные узкие места.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...