2013-07-21 41 views
2

只要我理解了準確的列表,就意味着「使輸出的第n行:1)在子節點2中找到n,如果n在子節點m1,m2,m3中的元素,3 )將函數應用於val 4)的m1,m2,m3 th元素,即輸出的第n行「MatLab準確地改變了排序

我在某處錯了嗎?

我跑了下面的代碼。

A = [2 10 13 ; 1 11 14; 1 12 10] 
[U,ix,iu]= unique(A(:,1)) 
vals = reshape(A(:, 2:end).', [], 1) 
subs = reshape(iu(:, ones(size(A, 2)-1,1)).', [], 1) 
r2 = accumarray(subs, vals', [], @(x){x'}) 
r2{1} 
r2{2} 

A =

2 10 13 
1 11 14 
1 12 10 

U =

1 
2 

IX =

3 
1 

IU =

2 
1 
1 

瓦爾斯=

10 
13 
11 
14 
12 
10 

潛艇=

2 
2 
1 
1 
1 
1 

R2 =

[1x4 double] 
[1x2 double] 

ANS =

12 11 14 10 

ANS =

13 10 

=========================

但我預計r{1} = 11 14 12 10,並r{2} = 10 13

爲什麼accumarray突然改變了排序?

我怎樣才能得到預期的結果?

回答

4

documentation of accumarray說:

注意如果subs下標不排序,fun不應該值的輸入數據的順序取決於 。

而你的subs沒有排序(至少不是按升序排列)。如果你讓subs排序和vals也被重新排列重寫代碼因此你得到期望的結果:

A = [2 10 13 ; 1 11 14; 1 12 10] 
[U,ix,iu]= unique(A(:,1)) 
vals = reshape(A(:, 2:end).', [], 1) 
subs = reshape(iu(:, ones(size(A, 2)-1,1)).', [], 1) 
[subs_sorted, I] = sort(subs); 
r2 = accumarray(subs_sorted, vals(I)', [], @(x){x'}) 
r2{1} 
r2{2} 

並運行該代碼返回:

ans = 
    11 14 12 10 
ans = 
    10 13 
+3

凡排序在[線性索引的意思](http://www.mathworks.com/help/matlab/math/matrix-indexing。html#f1-85511)判斷你是否有多列'subs'。 有關詳細信息,請參閱[這個問題](http://stackoverflow.com/questions/17536558/)我最近問。 – Oleg

+0

@Mohsen_Nosratinia謝謝!這工作。一旦我達到足夠的聲譽,我會投票給你的答案。 – user1849133

+2

@ user2604484你應該做的是_accept_答案 –