MatLab accmarray неожиданно меняет порядок

До тех пор, пока я понял accmarray, это означает "Создание n-й строки выходных данных: 1) найти n в подпункте 2) если n находится в m1, m2, m3-й элемент в подпункте, 3) применить функцию к m1, m2, m3-й элемент из val 4) это n-ая строка вывода "

Я где то не прав?

Я запустил следующий код.

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

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,

Почему accmarray вдруг изменил порядок?

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

1 ответ

Решение

Документация accmarray гласит:

Примечание Если подписки в 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
Другие вопросы по тегам