2014-09-29 2 views
2

Я работаю в Matlab и у меня есть следующая проблема: У меня есть B матрицу nx2 элементов, который содержит индексы для присвоения большой разреженной матрицы A (почти 500,000x80,000). Для каждой строки B первый столбец - это индекс столбца A, который должен содержать 1, а второй столбец - индекс столбца A, который должен содержать -1. Например:Matlab: Эффективное присвоение значений в разреженной матрице

B= 1 3 
    2 5 
    1 5 
    4 1 
    5 2 

Для этого B матрицы, то соответствующая Матрицы должно быть таким:

A= 1 0 -1 0 0 
    0 1 0 0 -1 
    1 0 0 0 -1 
    -1 0 0 1 0 
    0 -1 0 0 1 

Так, для строки i из B, соответствующей строки i из A должна быть полный нулей, кроме A(i,B(i,1))=1 и A(i,B(i,2))=-1

Это очень легко с петлей for по всем строкам B, b Это очень медленно. Я также пробовал следующую формулировку:

A(:,B(:,1))=1 
A(:,B(:,2))=-1 

Но Matlab дал мне ошибку «Ошибка в памяти». Если кто-нибудь знает более эффективный способ достичь этого, пожалуйста, дайте мне знать.

Заранее благодарен!

+1

Ваш код заполняет целые столбцы с 1 или -1. Вот почему у вас заканчивается память (и результат не будет тем, что вы хотите в любом случае) –

ответ

0

Вы можете использовать функцию sparse:

m = size(B,1); %// number of rows of A. Or choose larger if needed 
n = max(B(:)); %// number of columns of A. Or choose larger if needed 
s = size(B,1); 
A = sparse(1:s, B(:,1), 1, m, n) + sparse(1:s, B(:,2), -1, m, n); 
0

Я думаю, вы должны это сделать, используя функцию sub2ind. Эта функция преобразует матричные индексы в линейные индексы. Вы должны быть в состоянии сделать это так:

pind = sub2ind(size(A),1:n,B(:,1)); % positive indices 
nind = sub2ind(size(A),1:n,B(:,2)); % negative indices 
A(pind) = 1; 
A(nind) = -1; 

EDIT: Я (неправильно, я думаю) предположил, разреженную матрицу A уже существует. Если он не существует, то этот метод не будет лучшим вариантом.

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