Matlab 如何加速数组连接?

Matlab 如何加速数组连接?,matlab,Matlab,除了将结果与此相关,还有其他方法可以执行以下操作吗?我的意思是循环将持续,但vector=[vector,sumothervector];可以用其他方式得到吗 vector=[]; while a - b ~= 0 othervector = sum(something') %returns a vector like [ 1 ; 3 ] vector=[vector,sum(othervector)]; ... end vector=vector./100 这取决于你

除了将结果与此相关,还有其他方法可以执行以下操作吗?我的意思是循环将持续,但vector=[vector,sumothervector];可以用其他方式得到吗

vector=[]; 

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

end

vector=vector./100

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

我怀疑您希望通过将新结果连接到数组中来摆脱代码,以避免不断移动数组的影响

首先,只需确保应用程序中最慢的部分是由此引起的。看看Matlab分析器。如果您的代码的这一部分不是一个主要的时间消耗,那么不要花费大量的时间来改进它,只需告诉mlint忽略这一行代码即可

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

vector = zeros(1,100);
while a - b ~= 0
  othervector = sum(something);
  vector(iIteration) = sum(othervector);
  iIteration = iIteration + 1;
end
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*n次迭代,您可以尝试这样做:

vector = zeros(1,100);
while a - b ~= 0
  othervector = sum(something);
  vector(iIteration) = sum(othervector);
  iIteration = iIteration + 1;
end
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次迭代才调整数组的大小。我没有运行过这段代码,但我在以前的项目中使用过非常类似的代码。

好吧,这取决于您试图做什么。从这段代码开始,您可能需要考虑您正在执行的操作,以及您是否可以更改该行为。由于您提供的代码片段显示了很少的依赖关系,即a、b、某物和向量是如何相关的,因此我认为我们只能提供模糊的解决方案

我怀疑您希望通过将新结果连接到数组中来摆脱代码,以避免不断移动数组的影响

首先,只需确保应用程序中最慢的部分是由此引起的。看看Matlab分析器。如果您的代码的这一部分不是一个主要的时间消耗,那么不要花费大量的时间来改进它,只需告诉mlint忽略这一行代码即可

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

vector = zeros(1,100);
while a - b ~= 0
  othervector = sum(something);
  vector(iIteration) = sum(othervector);
  iIteration = iIteration + 1;
end
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*n次迭代,您可以尝试这样做:

vector = zeros(1,100);
while a - b ~= 0
  othervector = sum(something);
  vector(iIteration) = sum(othervector);
  iIteration = iIteration + 1;
end
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次迭代才调整数组的大小。我没有运行这段代码,但我在以前的项目中使用了非常类似的代码。

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


如果您只想用不同的方式编写vector=[vector,sumothervector];,您可以使用vectorend+1=sumothervector;相反。

如果您想优化速度,您应该预先分配向量,并为索引设置一个计数器,如@Egon所示


如果您只想用不同的方式编写vector=[vector,sumothervector];,您可以使用vectorend+1=sumothervector;相反。

a和b依赖于什么?什么东西依赖于什么?在a和b上?它总是一样的吗?不仅仅是一个条件,我想知道的是如何做vector=[vector,sum]
其他载体];换句话说,假设循环持续100次密切相关/可能重复的问题:,a和b依赖于什么?什么东西依赖于什么?在a和b上?它总是一样的吗?不仅仅是提出一个条件,我想知道的是如何做vector=[vector,sumothervector];换句话说,假设循环持续100次密切相关/可能重复的问题:,