我有一个以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
如果显式零的数量很大,这可能效率不高。任何更好的主意
答案 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中删除条目。我认为这不会产生太大影响。