2017-04-06 51 views
0
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函數,但我似乎無法理解合理運算符在for循環下的cumsum函數內如何工作。向量化while循環插入排序MATLAB

另外,我不明白如何[~,n]=find(array_j_indices==1)存儲值的矩陣n。它是否僅在列中存儲,因爲行中沒有(〜)?

回答

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);

最快實施?

注意,這個「矢量化」的代碼是慢以下(容易)實現:

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