2013-07-21 2 views
2

До тех пор, пока я понял накопитель, это означает «Создание n-й строки вывода: 1) найти n в подпункте 2), если n находится в m1, m2, m3-й элемент в sub, 3) применяют функцию к m1, m2, m3-й элемент val 4), то есть 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} 

А =

2 10 13 
1 11 14 
1 12 10 

U =

1 
2 

ие =

3 
1 

IU =

2 
1 
1 

Vals =

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.

Почему заказчик неожиданно изменил порядок?

Как я могу получить ожидаемый результат?

ответ

4

The 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_ ответ –