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