array = [2 1 3 2 1]
for i = 2:length(array)
value = array(i);
j = i - 1;
array_j=array(1:j);
array_j_indices=cumsum(array_j>value);
[~,n]=find(array_j_indices==1);
newArray=array;
array(n+1:i)=array_j(array_j>value);
j=j-max(array_j_indices);
array(j+1) = value;
end %forLoop
disp(array);
您好,
我看到这个代码用于矢量化而循环插入代码,但我似乎无法理解它是如何工作的。
cumsum(array_j>value)
如何运作?我理解并测试了cumsum函数,但我似乎无法理解(array_j>value)
的有理算子如何在for循环中的cumsum函数内工作。
另外,我不明白[~,n]=find(array_j_indices==1)
如何存储n的矩阵的值。它是否只在列中存储它,因为行中没有(〜)?
答案 0 :(得分:0)
<强> cumsum(array_j>value)
吗
array_j>value
:由于array_j
的排序性质,结果总是有些零后跟一些零,例如[0 0 0 0 1 1 1 1]
cumsum(array_j>value) = [0 0 0 0 1 2 3 4]
:最多一个元素将等于1
。
[~,n]=find(array_j_indices==1);
?
因为只有一行,所以这等于n=find(array_j_indices==1);
。
最快的实施?
请注意,这个&#39; vectorised&#39;代码慢于以下(更容易)实现:
for i = 2:length(array)
value = array(i);
j = i - 1;
n=find(array(1:j)>value,1);
array(n+1:i)=array(n:j);
array(n) = value;
end
并且比内置的matlab sort
方法慢得多。