2016-12-05 6 views
0

У меня есть большая разреженная матрица, что я работаю, но для простоты я написал ниже, как показано ниже:решения сингулярных разреженные матрицы MATLAB

row = [1,3]; 
col = [1,3]; 
val = [22,33]; 

B = sparse(row,col,val,3,3) 

22  0  0 
0  0  0 
0  0 33 

Этой матрица является особой и не имеет обратнога, что Я могу использовать для решения:

[A]=[B][C] =>[B]\[A] = [C].

Чтобы исправить это, все строки и столбцы, содержащие только ноль, необходимо удалить. Итак, в приведенном выше примере я удаляю строки 2 и столбец 2, прежде чем создавать разреженную матрицу.

Но если я попробую это, индекс, описываемый векторами строк и столбцов (3,3), будет выведен за пределы размеров матрицы и даст мне ошибку. Что я могу сделать, чтобы решить эту проблему?

ответ

1

Вы могли бы сначала построить ваш матрицы таким образом, что у вас есть, а затем удалить пустые строки и столбцы со следующими

C = B(any(B, 2), any(B, 1)); 

Это очень эффективно (космос-накрест), так как any применяется к разреженной матрицы дает редкий результат и выше операция индексации дает C что также разреженным

Хотя, в зависимости от вашей проблемы, это не будет гарантировать невырожденную матрицу.

Update

Если вы хотите удалить строку или столбец, если обе строки и соответствующий столбец равны нулю (чтобы сохранить вашу матрицу квадрат)

tokeep = any(B, 2).' | any(B, 1); 

C = B(tokeep, tokeep); 
+0

Разве это невероятно неэффективный метод при работе с крупными разреженными матрицами (1000000x1000000)? – Lobstw

+0

@Lobstw Нет, потому что все промежуточные значения также «разрежены» – Suever

+0

Благодарим вас за разъяснение. Однако это не приводит к ожидаемым результатам для случая, например: '[22 0 0; 44 0 0; 0 0 33]' 2-я строка не должна удаляться – Lobstw

0

Возможное решение

row = [1,3]; 
col = [1,3]; 
val = [22,33]; 
[ur,~,u_row] = unique(row); 
[uc,~,u_col] = unique(col); 
B =sparse(u_row,u_col,val,numel(ur),numel(uc));