求解奇异稀疏矩阵 MATLAB
Solving singular sparse matrix 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) 描述的索引将指向矩阵维度之外并给我一个错误。
我可以做些什么来解决这个问题?
您可以先按照现有的方式构建矩阵,然后使用以下方法删除空行和空列
C = B(any(B, 2), any(B, 1));
这是非常有效的(space-wise),因为 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));
我正在处理一个大的稀疏矩阵,但为了简单起见,我将其写在下面,如下所示:
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) 描述的索引将指向矩阵维度之外并给我一个错误。 我可以做些什么来解决这个问题?
您可以先按照现有的方式构建矩阵,然后使用以下方法删除空行和空列
C = B(any(B, 2), any(B, 1));
这是非常有效的(space-wise),因为 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));