Решение единственной разреженной матрицы 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), укажет размеры матрицы и выдаст ошибку. Что я могу сделать, чтобы решить эту проблему?

2 ответа

Решение

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

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

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

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

Обновить

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

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

C = B(tokeep, tokeep);

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

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));
Другие вопросы по тегам