如何加速数组连接?

时间:2011-03-31 15:51:08

标签: matlab

除了将结果汇总到此之外,还有其他方法可以执行以下操作,我的意思是循环会持续但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

2 个答案:

答案 0 :(得分:3)

嗯,这实际上取决于你想要做什么。从此代码开始,您可能需要考虑您正在执行的操作以及是否可以更改该行为。由于您提供的代码片段显示的依赖性很小(即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次迭代只调整一次数组。我没有运行这段代码,但我在以前的项目中使用了非常相似的代码。

答案 1 :(得分:2)

如果你想优化速度,你应该预先分配矢量,并为@Egon已经回答的索引提供一个计数器。

如果您只想采用不同的方式撰写vector=[vector,sum(othervector)];,则可以使用vector(end + 1) = sum(othervector);代替。