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

Posted

技术标签:

【中文标题】可以像在 Python 中一样在 MATLAB 中进行并行遍历吗?【英文标题】:Can parallel traversals be done in MATLAB just as in Python? 【发布时间】:2010-09-08 03:17:54 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

如果 x 和 y 是列向量,你可以这样做:

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

(对于行向量,只需使用xy)。

这是一个运行示例:

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

【讨论】:

@Hi-Angel:我不确定你在说什么,但你可以这样做foo = x+y。在 MATLAB 中通常不需要循环。【参考方案2】:

仅以八度音阶测试...(无 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

【讨论】:

这是我最喜欢的,因为它不仅适用于 for 循环,而且适用于内联语句。非常感谢! :)【参考方案3】:

如果我没记错你在 python creates a pair of the items found in list1 and list2 中使用的 zip 函数。基本上它仍然是一个 for 循环,另外它会为你从两个单独的列表中检索数据,而不是你必须自己做。

因此,也许您最好的选择是使用 标准 for 循环,如下所示:

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

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

如果你真的在谈论并行计算,那么你应该看看Parallel Computing Toolbox for matlab,更具体地说是parfor

【讨论】:

【参考方案4】:

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

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

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

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

【讨论】:

【参考方案5】:
for (x,y) in zip(List1, List2):

例如应该是:

>> for row = 'string' 10
>>           'property' 100 '
>>    fprintf([row1,: '%d\n'], row2, :);
>> 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([row1,: '%d\n'], row2,:);
>> end
string1
string2
string3
string4
string5
string6
string7
string8
string9
string10

【讨论】:

For 遍历参数的 ,而不是行。查看最受好评的答案,看看它是如何工作的。 亲爱的 Cris,我更新了评论。它仍然很棘手,但代码相当直观。 matlab 中的单元格有潜力(但说实话,它可能并不漂亮......)。【参考方案6】:

如果我有两个具有相同维度 No 2 大小的数组 al 和 bl,并且我想遍历这个维度(比如乘以 al(i)*bl(:,i))。那么下面的代码就可以了:

al = 1:9;
bl = [11:19; 21:29];

for data = [num2cell(al); num2cell(bl,1)]

    [a, b] = data:;
    disp(a*b)

end

【讨论】:

【参考方案7】:

过去,MATLAB 中的for 循环很慢,但现在已经不是这样了。

因此,矢量化并不总是奇迹般的解决方案。只需使用分析器以及tictoc 函数来帮助您识别可能的瓶颈。

【讨论】:

根据我的经验,'arrayfun' 比'for' 慢很多,例如 Arrayfun 没有矢量化,它只是一个看起来很花哨的循环。 这实际上是如何回答这个问题的?该问题询问您是否可以遍历两个向量之间的相应元素对,不是它应该有多有效。 @FrankT,代码作为代码,而不是在引号之间。请不要仅仅为了徽章而随意编辑,如果你编辑了,那就算数。 我正在改进建议的编辑。感谢您的建设性批评。

以上是关于可以像在 Python 中一样在 MATLAB 中进行并行遍历吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以像在 c++ 中使用指针一样修改函数中的变量而不在 python 中返回吗

如何在 Python 中结束函数,就像在 C++ 中使用“return”一样 [关闭]

像在 python 中一样在 C++ 中读取二进制文件

我可以像matlab一样在python中获得完全相同的总和输出吗

我们可以像在 android 中一样在 windows 中创建 XMPP 聊天客户端代码吗?

像在 numpy 中一样使用 tf.slice 检测越界切片