разреженные значения матрицы как индексы к другой матрице

S - NxN разреженная матрица.
A - Mx1 вектор.

Ненулевые значения S являются индексами A.
Я хочу вычислить вектор x таким образом, чтобы в i-й записи x:
для каждого ненулевого значения j в i-й строке S , возьмите A[j], вычислите сумму всех этих j и поместите ее в i-й элемент x.

в псевдо это должно выглядеть так:

  for i = 1:N
     for j = 1:N
        if( s[i][j] != 0)
           x[i] += s[ A[i,j] ]

как я могу сделать это в matlab наиболее эффективным способом?


person IceCube    schedule 16.04.2015    source источник
comment
может быть, должен быть другой инкремент? как x[i] += A[s[i][j]]?   -  person Macaronnos    schedule 16.04.2015


Ответы (3)


Давайте попробуем использовать find и accumarray:

[ii jj sij] = find( S );
x = accumarray( ii, A(sij), [1 size(S,1)] );
person Shai    schedule 16.04.2015
comment
Он думает, что вам нужно x = accumarray( ii, A(jj), [size(S,1), 1] ).'; - person Luis Mendo; 16.04.2015
comment
Привет, A имеет размер Mx1, а S - NxN, я имею в виду, что A (jj) неверен, мне нужно взять A [S [i] [j]] - person IceCube; 16.04.2015
comment
это работает нормально или у меня: x = accumarray(ii, A(nonzeros(S)), [size(S,1), 1]).' спасибо вам, ребята - person IceCube; 16.04.2015

Это просто умножение матриц:

x = (S~=0)*A(1:size(S,2));

Matlab эффективно умножает матрицы с разреженными матрицами, так что это должно быть довольно быстро.

person Luis Mendo    schedule 16.04.2015
comment
что если numel(A)<size(S,2)? - person Shai; 16.04.2015
comment
@Шай, я понятия не имею. В этом случае проблема не определена. ОП должен указать, что они хотят. В этом случае их код также потерпит неудачу, как и ваш (даже с моей поправкой). - person Luis Mendo; 16.04.2015
comment
но, как я уже сказал: S - разреженная матрица NxN. A - вектор Mx1. когда M не обязательно равно N - person IceCube; 16.04.2015
comment
@user3175582 user3175582 Но M должно быть больше или равно N, иначе проблема не определена. - person Luis Mendo; 16.04.2015

На самом деле это похоже на ответ Шай, но вместо sij используется ненулевое значение (S):

[ii jj] = find( S );
x = accumarray( ii, A(nonzeros(S)), [size(S,1), 1] ).' 
person IceCube    schedule 16.04.2015
comment
По сути, это ответ Шай. Вы должны принять этот ответ (особенно, если Шай внесет исправление) вместо того, чтобы публиковать свой собственный - person Luis Mendo; 16.04.2015