【问题标题】:How would you remove the loop from this matlab code你将如何从这个 matlab 代码中删除循环
【发布时间】:2015-10-28 19:21:11
【问题描述】:

鉴于我们有:

  • x 是二维矩阵,大小为 [numSamples x numFeatures]
  • A 是 2d 方阵,大小为 [numFeatures x numFeatures]
  • B 是大小为 [1 x numFeatures] 的一维向量

我想在没有循环的情况下评估以下代码:(或以更快的方式)

out = zeros(1,numSamples);
for i = 1:numSamples
    res = sum(repmat(B - x(i,:), numSamples, 1)*A.*(x - repmat(x(i,:), numSamples, 1)), 2).^2;
    out(i) = var(res);
end

如果您对上述更快的改进有其他建议,也非常欢迎。

【问题讨论】:

  • 让我们退后一步。当您在测试数据上运行此代码时,它的速度有多快?你对时间不满意吗?
  • 很遗憾没有。对于大量样本,它变得非常慢。
  • 除了上面的评论之外,您是否尝试实施特定的公式?
  • 没什么名气。这是整个公式的简化部分,其余的是规范化表达式,我觉得包括它们只会使事情复杂化。我觉得如果你能帮我解决这个简化的表达式,我确信我可以推断出更一般的表达式。

标签: matlab vectorization


【解决方案1】:

您可以bsxfun 那些逐个 获得矢量化解决方案 -

P1 = bsxfun(@minus,B,x)*A;
P2 = bsxfun(@minus,x,permute(x,[3 2 1]));
out = var(squeeze(sum(bsxfun(@times,P1,P2),2)).^2.');

部分矢量化方法 -

P = (bsxfun(@minus,B,x)*A).';  %//'
out = zeros(1,numSamples);
for i = 1:numSamples
    out(i) = var((bsxfun(@minus,x,x(i,:))*P(:,i)).^2);
end

【讨论】:

  • 感谢您的回复,让我验证一下是否有效:)
  • @user2324712 该死的,我看到那里有些难以置信! ;)
  • @user2324712 当然,这是最好的方法!
  • 那肯定解决了。在我老化的笔记本电脑上,matlab 中的 jit 解决方案使原始实现更快。但我很确定,对于 gpu 上的大数据,您的解决方案会成功。谢谢!
  • @user2324712 bsxfun 喜欢cake 又名memory,所以要好好喂它;) 请小心,因为对于大量数据,内存传输而不是实际计算可能会减慢速度.但是,所有这些都很大程度上取决于 GPU 和相关的硬件。
猜你喜欢
  • 1970-01-01
  • 2015-01-13
  • 2014-07-25
  • 2014-08-13
  • 2021-05-10
  • 2011-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多