可以像在Python中一样在MATLAB中完成并行遍历吗?

时间:2020-03-05 18:49:13  来源:igfitidea点击:

使用zip函数,Python允许循环并行遍历多个序列。

对于zip(List1,List2)中的(x,y):

MATLAB是否具有等效的语法?如果没有,使用MATLAB同时迭代两个并行数组的最佳方法是什么?

解决方案

回答

如果我没记错的话,我们在python中使用的zip函数会创建一对在list1和list2中找到的项。基本上,它仍然是一个for循环,另外它将为我们从两个单独的列表中检索数据,而不必我们自己执行。

因此,也许最好的选择是使用标准的for循环:

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

或者与数据有关的任何事情。

如果我们真的在谈论并行计算,那么我们应该看一下适用于matlab的Parallel Computing Toolbox,尤其是parfor

回答

仅在八度中测试过...(无matlab许可证)。存在arrayfun()的变体,请查看文档。

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

产量...

x =

   11   22   33

回答

如果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
>>

回答

MATLAB中的for循环曾经很慢,但是现在不再如此。

因此,矢量化并不总是奇迹般的解决方案。只需使用探查器,然后使用tic和toc函数来确定可能的瓶颈。

回答

我建议加入两个数组进行计算:

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

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

如果函数可以与向量一起使用,这将非常有用。再说一次,许多函数甚至可以使用矩阵,因此我们甚至不需要循环。