可以像在 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
(对于行向量,只需使用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
>>
【讨论】:
@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
循环很慢,但现在已经不是这样了。
因此,矢量化并不总是奇迹般的解决方案。只需使用分析器以及tic
和toc
函数来帮助您识别可能的瓶颈。
【讨论】:
根据我的经验,'arrayfun' 比'for' 慢很多,例如 Arrayfun 没有矢量化,它只是一个看起来很花哨的循环。 这实际上是如何回答这个问题的?该问题询问您是否可以遍历两个向量之间的相应元素对,不是它应该有多有效。 @FrankT,代码作为代码,而不是在引号之间。请不要仅仅为了徽章而随意编辑,如果你编辑了,那就算数。 我正在改进建议的编辑。感谢您的建设性批评。以上是关于可以像在 Python 中一样在 MATLAB 中进行并行遍历吗?的主要内容,如果未能解决你的问题,请参考以下文章
我可以像在 c++ 中使用指针一样修改函数中的变量而不在 python 中返回吗
如何在 Python 中结束函数,就像在 C++ 中使用“return”一样 [关闭]
我可以像matlab一样在python中获得完全相同的总和输出吗