2015-04-16 3 views
3

S - N x N редкая матрица.
A - M x1 вектор.Редкие значения матрицы как индексы к другой матрице

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

в псевдо он должен выглядеть следующим образом:

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

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

+1

может быть там должен быть другой прирост? как x [i] + = A [s [i] [j]]? – Macaronnos

ответ

1

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

[ii jj sij] = find(S); 
x = accumarray(ii, A(sij), [1 size(S,1)]); 
+1

Думаю, вам нужно 'x = accumarray (ii, A (jj), [size (S, 1), 1]). '; –

+0

Привет, A от размерности Mx1 и S есть NxN, я имею в виду, что A (jj) неверно. Мне нужно взять A [S [i] [j]] –

+1

это прекрасно работает или меня: x = accumarray (ii, A (ненулевые (S)), [размер (S, 1), 1]). спасибо вам, ребята –

0

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

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

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

+0

что, если 'numel (A) <размер (S, 2)'? – Shai

+0

@Shai Я понятия не имею. В этом случае проблема не определена. ОП должен указать, что они хотят. В этом случае их код также потерпит неудачу, как и ваши (даже с моей коррекцией). –

+0

но как я сказал: S - NxN разреженная матрица. A - Mx1 вектор. , когда M не обязательно равно N –

0

Это на самом деле, как ответ Шай, но использует ненулевые (S) вместо ССГ:

[ii jj] = find(S); 
x = accumarray(ii, A(nonzeros(S)), [size(S,1), 1]).' 
+2

Это по существу [ответ Шая] (http://stackoverflow.com/a/ 29671739/2586922). Вы должны принять этот ответ (особенно если Шай делает исправление) вместо того, чтобы публиковать свои собственные –

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