【问题标题】:How to speed up array concatenation?如何加快数组串联?
【发布时间】:2011-03-31 15:51:07
【问题描述】:

除了将结果连接到此之外,还有其他方法可以执行以下操作,我的意思是循环将持续存在,但可以通过任何其他方式获得vector=[vector,sum(othervector)];

vector=[]; 

while a - b ~= 0
  othervector = sum(something') %returns a vector  like [ 1 ; 3 ]
  vector=[vector,sum(othervector)]; 
  ...

end

vector=vector./100

【问题讨论】:

标签: matlab


【解决方案1】:

嗯,这真的取决于你想要做什么。从这段代码开始,您可能需要考虑您正在执行的操作以及是否可以更改该行为。由于您提供的代码的 sn-p 显示出很少的依赖关系(即 a、b、某物和向量如何相关),我认为我们只能提供模糊的解决方案。

我怀疑您想通过将新结果连接到其中来摆脱代码以规避不断移动数组的影响。

首先,请确保您的应用程序的最慢部分是由此引起的。看看 Matlab 分析器。如果你的那部分代码不是很耗费时间,不要费心花很多时间来改进它(只需告诉 mlint 忽略那行代码)。

如果您可以充分分析代码以确保迭代次数恒定,则可以预先分配变量并防止任何性能损失(即在最坏的情况下编写 for 循环,或者更好但真正矢量化的代码)。或者,如果您可以“分解”一些变量,这也可能会有所帮助(将任何循环不变量移到循环之外)。所以这可能看起来像这样:

vector = zeros(1,100);
while a - b ~= 0
  othervector = sum(something);
  vector(iIteration) = sum(othervector);
  iIteration = iIteration + 1;
end

如果您的代码的性质不允许这样做(例如,您正在迭代以实现收敛;在这种情况下,请注意检查双精度数的相等性:始终包含容差),您可以执行一些技巧来提高性能,但其中大多数只是经验法则或试图充分利用糟糕的情况。在最后一种情况下,您可能会添加一些维护代码以获得稍微更好的性能(但是您在时间消耗方面获得的收益,在内存使用方面会有所损失)。

假设您希望代码在大多数情况下运行 100*n 次迭代,您可能会尝试执行以下操作:

iIteration = 0;
expectedIterations = 100;

vector = [];
while a - b ~= 0
    if mod(iIteration,expectedIterations) == 0
      vector = [vector zeros(1,expectedIterations)];
    end
    iIteration = iIteration + 1;
    vector(iIteration) = sum(sum(something));
    ...

end

vector = vector(1:iIteration); % throw away uninitialized
vector = vector/100;

它可能看起来不漂亮,但不是每次迭代都调整数组的大小,而是每 100 次迭代才调整数组的大小。我没有运行这段代码,但我在以前的项目中使用过非常相似的代码。

【讨论】:

    【解决方案2】:

    如果您想优化速度,您应该预先分配向量并为索引设置一个计数器,正如@Egon 已经回答的那样。

    如果你只是想用不同的方式写vector=[vector,sum(othervector)];,你可以改用vector(end + 1) = sum(othervector);

    【讨论】:

      猜你喜欢
      • 2012-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-23
      • 2017-08-30
      • 1970-01-01
      相关资源
      最近更新 更多