Добавление через линейную индексацию

У меня есть матрица M 256 x 256, и я создал несколько линейных индексов L.

Также у меня есть вектор весов, числовых значений, таких же, как L, которые нужно добавить к элементам M, индексированным L. Проблема в том, что с выражением

M(L) = M(L) + weights;

Для повторяющихся значений в L будет добавлен только последний соответствующий элемент в весах.

Есть ли простой способ решить эту проблему/я что-то упустил?


person Temp    schedule 28.11.2012    source источник
comment
псевдокод, который вы написали, работает для меня. Смотрите, чтобы вы не перезаписали weights или L где-то раньше...   -  person bla    schedule 28.11.2012
comment
@nate Попробуйте запустить это: X = [1; 1]; L = [1 1 2]; W = 10 * ones(length(L), 1); X(L) = X(L) + W;. Я думаю, что поведение, которое пытается получить OP, заключается в том, что X должен заканчиваться первым элементом, равным 21, и вторым элементом, равным 11. Но предоставленный мной код дает оба элемента, равные 11. Интересная проблема! Ваше здоровье.   -  person Colin T Bowers    schedule 28.11.2012
comment
@ColinTBowers да, это. МОЖЕТ ли быть обходной метод, возможно, с уникальным() для суммирования всех относительных элементов?   -  person Temp    schedule 28.11.2012


Ответы (1)


Я думаю, что здесь можно использовать accumarray:

% The 'data'
M = zeros(10,5); % Suppose this is your matrix
L = [46 47 47 46 48 49 48 48 48]'; % The linear index numbers
weights = [4 7 4 6 4 9 48 8 48]'; % The weights for these index numbers

% Make sure the indices are in ascending order
Y = SORTROWS([L weights]);

% Determining the weights to be added
idx = unique(Y(:,1));
weights_unique = accumarray(Y(:,1),Y(:,2));

% The addition
M(idx) = M(idx) + weights_unique(weights_unique>0);
person Dennis Jaheruddin    schedule 28.11.2012
comment
Вау, это точно. Я пытался сделать это вручную и без циклов, и я впадал в отчаяние. спасибо! - person Temp; 28.11.2012
comment
Я обновил ответ, чтобы убедиться, что он также работает, если ваш индекс не отсортирован заранее. - person Dennis Jaheruddin; 28.11.2012
comment
Будет ли какая-либо причина несоответствия результирующей длины весов и уникальных (индексов)? - person Temp; 28.11.2012
comment
да, если бы ваш L был бы [3 3 2 2 2 1], мой исходный код потерпел бы неудачу, поскольку unique включает этап сортировки, а accumarray — нет. - person Dennis Jaheruddin; 28.11.2012
comment
@DennisJaherudin Я пытаюсь использовать accumarray для двух векторов одинакового размера L, W. Даже при сортировке я получаю разные числа для уникального (L) и результата accumarray. Однако тестирование L и W с другими векторами-партнерами работает. Любой совет? - person Temp; 29.11.2012
comment
@DennisJaherudin Пожалуйста, попробуйте accumarray со следующими индексами: L = [46 47 47 46 48 49 48 48 48] По какой-то причине я продолжаю получать numel(unique_weights) = 49 (да, сначала отсортировав их) - person Temp; 29.11.2012
comment
Очевидно, это работало только в том случае, если использовались все индексы, теперь я обновил его, чтобы он соответствовал вашему вектору. - person Dennis Jaheruddin; 30.11.2012