2013-11-01 2 views
4

Мне нужно понять, как аккумулировать код, который мне действительно нужен.Понимание накопителя в Matlab

Я пытался понять http://www.mathworks.co.kr/kr/help/matlab/ref/accumarray.html

Большинство примеров было ясно.

Тем не менее, в 1-ом примере примера 2, я подумал

(1,2) -й элемент B должен быть 1

, потому что

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

Кроме того, во 2-й пример из примера 2, я думал, что

(1,2) -ый элемент B1 должен быть 2 вместо -2

потому

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

, а также я думал

(4,1) -го элемента В1 должно быть 1 вместо -1

потому

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

Что мне не хватает?

Пожалуйста, исправьте, мне нужно понять, что аккумулировать в глубину, чтобы написать собственный код.

ответ

2

Я думаю, что неожиданные значения - это то, что вы ожидаете, что значения будут переданы анонимной функции в том же порядке, что и соответствующие индексы, отображаемые в подсистемах.

Однако документация accumarray говорит:

Примечания Если индексы в подлодках не сортируются, забава не должна зависеть от порядка значений в его входных данных.

Это означает, что начало подводных лодок (1 2; 1 2;) может привести к передаче 102 101 или 101 102 анонимной функции (поскольку в документации говорится, что забава не должна зависеть от порядка значений .

сумма (Diff ([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 показывает, как сортировать субтитры и применять этот порядок сортировки к vals, чтобы получить ответ, который вам нужен. – 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 

По крайней мере, это увидит, что это то, что говорится в документации в документации.

Смежные вопросы