【问题标题】:How can I vectorize this code in Matlab?如何在 Matlab 中对这段代码进行矢量化?
【发布时间】:2013-03-08 19:35:35
【问题描述】:

如何在不使用 for 循环的情况下实现这个 Matlab 代码?

b=10:10:50
a=50*rand(1,50);

for ii=2:numel(b)
    ind{ii}=find(a<b(ii) & a>b(ii-1));
end

【问题讨论】:

  • “矢量化”是什么意思?在循环的每一步中,您都会丢弃之前计算的ind 值,因此您只需要执行最后一步。你的代码有错误吗?
  • 向量化是指没有for循环。 ind 可以是一个细胞。我将编辑问题,以便更清楚。
  • 完全执行您在此处执行的操作(使用find,将结果存储在单元格数组中),循环可能是您最快的选择。另一方面,如果您的程序可以使用逻辑索引或其他一些技术,那么非循环解决方案可能会加快速度。但是,您没有提供足够的信息来了解这一点。

标签: matlab vectorization


【解决方案1】:

看起来你正在做一个直方图并跟踪哪个元素最终在哪个 bin 中。这意味着您可以通过以下几行“几乎”获得您想要的东西:

a = 50 * rand(1, 50);
b = 10:10:50;
[h c] = histc(a, b);

现在 c 包含 a 中每个元素的“bin”的索引。例如如果

a = [15 22 9 7 25];

然后

c = [1 2 0 0 2];

不确定将这些收集到一个单元格数组中的价值 - 在我看来,无论您想对ind 中的值做什么,都可以使用c 来完成。

我怀疑使用“向量”操作(这意味着具有相同长度的事物)创建一个元胞数组(可能具有不同的长度)可能很困难......有兴趣看到有人提出反例!

编辑:我发现了我自己的反例...以下行生成单元数组ind,就像您的代码一样(arrayfun 命令确实有一个隐含的for 循环,但被认为是“矢量化”)。

ind = arrayfun(@(x)find(x==c),1:numel(b)-1, 'uniformoutput', false);

请注意,完成此操作后,单元格数组 ind 的值从单元格 ind{1} 开始,而您的原始代码从单元格 ind{2} 开始索引。如果这是一个问题,我相信你可以解决它......

另请注意,您的代码在050 之间生成随机数,但您的“有效箱”仅在1050 之间(因为您编写算法的方式)。因此,收集到的索引总和将略少于 50(平均为 40)。

【讨论】:

  • 谢谢,我想这就是答案,虽然对于相对较小的数字,for 循环仍然更快。当你得到更大的数组时,arrayfun 获胜......
  • 你是对的 - 但你要求的是矢量化代码,而不是快速代码......我通过回答这个问题学到了一些东西(关于 arrayfun()) - 所以也感谢你。
【解决方案2】:

下面的脚本会做同样的事情。矩阵newInd 将包含分配给ind 并由循环打印出来的相同值。

b=10:10:50;
a=sort(randi(50,1,10));

% create shifted version of vector b to account
% for comparison between i and i-1
newB1 = b(1:end-1);
newB2 = b(2:end);

% create tiled version of a and b
newB1 = repmat(newB1',1,numel(a));
newB2 = repmat(newB2',1,numel(a));
newA = repmat(a,numel(b)-1,1);

%find linear indices that meet required conditions
LinearInd = find(newA<newB2 & newA>newB1);
%convert linear indices to subscripts
[i,newInd] = ind2sub(size(newA),LinearInd);
% display indices that correspond to ind
newInd

【讨论】:

  • 感谢您的努力,但此代码比 for 循环慢一个数量级...
猜你喜欢
  • 2015-09-04
  • 1970-01-01
  • 2020-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-25
相关资源
最近更新 更多