Matlab中带有显式零的稀疏矩阵

时间:2018-04-09 02:20:10

标签: matlab sparse-matrix

我有一个以matlab格式存储的稀疏矩阵,带有显式零(取二进制值)。我想组合这些矩阵并将结果转换为另一种稀疏矩阵格式。我的尝试是将二进制的向量保持为零值,并在调用稀疏矩阵后将其置零。像这样:

function matlab_to_HB(matName ,fileName ,title ,  key , type)

data = load(matName);
SMat = data.Problem.A; % the nonzero values
 [i,j,v] = find(SMat);
 if(isfield(data.Problem,'Zeros'))
  zerosMat =  data.Problem.Zeros; % indices of zero values
 [ii,jj,vv] = find(zerosMat); % vv is a vector of ones
  vvSize = size(ii , 1);
ifmt = 8;
job = 2;
rhs = 0;

test2 = sparse([i ; ii],[j;jj],[v;vv]); % sparse immediately removes the explicit zeros. I want to combine the the zeros with the nonzeros.

for idx =1 : vvSize
  test2(ii(idx) , jj(idx)) = 0.0;  
end
     dm2hb(fileName ,test2,rhs,title,key,type,ifmt,job) 

    end

如果显式零的数量很大,这可能效率不高。任何更好的主意

1 个答案:

答案 0 :(得分:0)

Matlab从不允许以稀疏格式存储零条目,这通常不方便并且可能会破坏性能。 即使你写了一个mex文件,然后传递一个带有一些零的稀疏矩阵,它也会非常窒息。 请注意,删除非零元素是一个非常低效的转换过程。如果你想留在Matlab,最好和最有效的方法是存储一个完整的矩阵,并在添加所有元素后将其存储为稀疏。

for idx =1 : vvSize
 test2(ii(idx) , jj(idx)) = 0.0;  
end
test2 = sparse([i ; ii],[j;jj],[v;vv]);

我猜你可以实现一个高效的C代码,特别是如果你的矩阵很大的话。如果不是,上述代码应该可以正常工作。

另一种方法是直接从Matlab中的Ax和Ap中删除条目。我认为这不会产生太大影响。