矢量化循环插入排序matlab

时间:2017-04-06 12:20:37

标签: matlab

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的矩阵的值。它是否只在列中存储它,因为行中没有(〜)?

1 个答案:

答案 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方法慢得多。