2013-11-01 42 views
4

我需要理解accumarray編寫一個我真正需要的代碼。在Matlab中瞭解accumarray

我試圖理解http://www.mathworks.co.kr/kr/help/matlab/ref/accumarray.html

大多數的例子是明確的。

然而,在實施例2的第一例,我想

第(1,2)B的元素應該是1

因爲

(1,2) = 1st, 2nd of subs 
1st, 2nd of vals = 101, 102 
sum(diff([101,102]))=1 

此外,在第二實施例我認爲

B1的第(1,2)個元素應該是2而不是-2

因爲

(1,2) = 1st, 3rd of subs 
1st, 3rd of vals = 101, 103 
sum(diff([101,103]))=2 

而且我想

(4,1)日B1的元素應該是,而1-1

因爲

(4,1) = 5,6th of subs 
5,6th of vals = 105,106 
sum(diff([105,106]))=1 

我缺少什麼?

請更正,我需要深入瞭解accumarray編寫我自己的代碼。

回答

2

我認爲意想不到的價值是因爲你期望的價值被傳遞到匿名函數以相同的順序相關的指數出現在潛艇。

然而,accumarray該文件說:

注意如果在潛艇的標不排序,好玩不應該的值的輸入數據的順序取決於 。

這意味着subs(1 2; 1 2;)的開始可能導致102 101或101 102被傳遞給匿名函數(因爲文檔說樂趣不應該依賴於值的順序。

總和(差異([102 101]))是-1,是寫入元件1,2在實施例

val = 101:106; 
subs=[1 2; 1 2; 3 1; 4 1; 4 4; 4 1]; 
B = accumarray(subs,val,[],@(x)sum(diff(x))) 

B = 

    0 -1  0  0 
    0  0  0  0 
    0  0  0  0 
    2  0  0  0 

我不知道爲什麼會Mathworks公司選擇使用的值diff函數,當diff的結果顯然依賴於傳遞給它的值的順序時。

看起來像這個輸入值排序是其他輸出值與您的期望不同的原因。

+0

剛纔注意到你之前曾問過一個非常類似的問題。 http://stackoverflow.com/questions/17774015/matlab-accumarray-unexpectedly-changing-ordering – grantnz

+0

謝謝。但是,我怎麼知道MatLab是否會通過[102 101]或[101 102]?如果我不知道這一點,顯然我不能以系統的方式進行編碼。 – user1849133

+0

chappjc顯示瞭如何對潛艇進行排序,並將此排序順序應用於val以獲得您之後的答案。 – grantnz

1

爲什麼在grantnz的答案,這裏是如何獲得可預見的行爲。

正如文檔所言:「如果subs中的下標未排序,則fun不應依賴於其輸入數據中值的順序。」因此,要獲得accumarray以外的可預測行爲,必須對潛艇進行排序。

這意味着代表矩陣中(行,列)位置的下標是下標點指向的元素必須根據線性索引排序。因此,要「排序」2D下標,您需要對等效線性索引進行排序。然後,您需要將該訂單應用到vals,否則您已經混淆了您的數據。

val = 101:106; 
subs = [1 2; 1 2; 3 1; 4 1; 4 4; 4 1]; 

% convert the subscripts to linear inds and sort them 
inds = sub2ind([4 4],subs(:,1),subs(:,2)); 
[indsSorted,sortingInds] = (sort(inds)); 

% apply the sorting to val 
valsSorted = val(sortingInds); 

% convert inds back to subs 
[iiS jjS] = ind2sub([4 4],indsSorted); 
subsSorted = [iiS jjS]; 

B = accumarray(subsSorted,valsSorted,[],@(x)sum(diff(x))) 

B = 

    0  1  0  0 
    0  0  0  0 
    0  0  0  0 
    2  0  0  0 

至少它會看到這是文檔中的說明。