Вопрос:

Можно ли выполнять параллельные обходы в MATLAB так же, как в Python?

python arrays matlab for-loop

4402 просмотра

6 ответа

46 Репутация автора

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

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

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

Автор: Jason Источник Размещён: 08.09.2008 08:25

Ответы (6)


6 плюса

11210 Репутация автора

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

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

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

или что бы вы ни делали с данными.

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

Автор: sven Размещён: 08.09.2008 11:34

5 плюса

201 Репутация автора

Проверено только в октаве ... (без лицензии 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
Автор: DMC Размещён: 09.09.2008 02:32

15 плюса

1810 Репутация автора

Если 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
>> 
Автор: mattiast Размещён: 15.09.2008 07:20

-2 плюса

0 Репутация автора

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

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

Автор: Vincent Размещён: 26.09.2008 11:31

1 плюс

6708 Репутация автора

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

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

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

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

Автор: bastibe Размещён: 20.10.2008 02:22

0 плюса

1 Репутация автора

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

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

for row = {"x1" "y1"
            "x2" "y2"}'
    x = row{1,:};
    y = row{2,:};
end

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

Автор: Sean Размещён: 01.02.2019 03:52
Вопросы из категории :
32x32