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