Решение единственной разреженной матрицы 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));