在矩阵中查找最稀疏的行

Str*_*sta 1 matlab matrix sparse-matrix

我在MATLAB中有一个矩阵,我想确定哪一行包含最多的零.也就是说,我想在矩阵中找到最稀疏的行(和列).有mat(sum(mat==0,i)==i,:)什么办法比循环更有效地做到这一点?或者这是首选方法?

我通过使用"最小度排序启发式"来解决线性系统,将其用于LU分解的实现.

ray*_*ica 7

如果我正确地解释这一行,要找到"最稀疏"行,这意味着您要查找具有最多零的行.您可以使用sum矢量化方式结合使用max来表明:

[~, row] = max(sum(mat == 0, 2));
Run Code Online (Sandbox Code Playgroud)

mat == 0将你的整个矩阵转换成true/false这样true是零值,false否则的话,我们使用sum和求和每一行单独.这将减少问题,使得每个元素计算每行遇到的零元素数.max因此,使用此结果的第二个输出row将包含具有最大量的零的任何行.我们忽略了第一个输出,因为这将输出我们根据您的问题不关心的实际最大值.

如果您关心速度,可以true/false使用带有向量的转换矩阵执行矩阵向量乘法ones.这样它就会为你执行求和,从而将矩阵提升到double精度:

[~, row] = max((mat == 0)*ones(size(mat, 2), 1)));
Run Code Online (Sandbox Code Playgroud)

次要说明

请注意,如果有多个行共享相同数量的最大零数,则此方法的限制是它将返回满足此条件的第一行.就你的目标而言,我认为这应该足够了.另请注意,如果矩阵不包含,则此方法的输出将默认为第一行.有一些我不考虑的角落情况,但我不确定你需要在多大程度上检查这些,所以为了简单起见,我会把它们留下来.