Matlab 查找矩阵中最稀疏的行

Matlab 查找矩阵中最稀疏的行,matlab,matrix,sparse-matrix,Matlab,Matrix,Sparse Matrix,我在MATLAB中有一个矩阵,我想确定哪一行包含最多的零。也就是说,我想找到矩阵中最稀疏的行(和列)。有没有比使用mat(sum(mat==0,i)==i,:)循环更有效的方法?或者这是首选的方法 我使用它来实现LU分解,通过使用“最小度排序启发式”来求解线性系统。要找到“最稀疏”行,如果我正确解释了这一点,这意味着您希望找到零数最多的行。您可以将sum与max结合使用,以矢量化方式计算: [~, row] = max(sum(mat == 0, 2)); mat==0将把整个矩阵转换成tru

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

我使用它来实现LU分解,通过使用“最小度排序启发式”来求解线性系统。

要找到“最稀疏”行,如果我正确解释了这一点,这意味着您希望找到零数最多的行。您可以将
sum
max
结合使用,以矢量化方式计算:

[~, row] = max(sum(mat == 0, 2));
mat==0
将把整个矩阵转换成
true/false
,这样
true
是一个零值,
false
否则,我们使用
sum
对每一行分别求和。这将减少问题,使每个元素统计每行遇到的零元素数量。在这个结果上使用
max
的第二个输出,
将因此包含零数量最大的行。我们忽略第一个输出,因为这将输出我们不关心的实际最大值

如果您关心速度,可以使用转换后的
true/false
矩阵执行矩阵向量乘法,向量为
one
。这样,它将为您执行求和,因此矩阵将提升到
double
精度:

[~, row] = max((mat == 0)*ones(size(mat, 2), 1)));
小调 请注意,如果有多行共享相同数量的找到的最大数量的零,此方法的限制是它将返回满足此条件的第一行。就你的目标而言,我认为这应该足够了。还要注意,如果矩阵不包含零,则此方法的输出将默认为第一行。有一些情况我没有考虑,但我不确定您需要在多大程度上检查这些情况,因此为了简单起见,我将省略这些情况。

要找到“最稀疏”的行,如果我正确解释了这一点,这意味着您希望找到零数最多的行。您可以将
sum
max
结合使用,以矢量化方式计算:

[~, row] = max(sum(mat == 0, 2));
mat==0
将把整个矩阵转换成
true/false
,这样
true
是一个零值,
false
否则,我们使用
sum
对每一行分别求和。这将减少问题,使每个元素统计每行遇到的零元素数量。在这个结果上使用
max
的第二个输出,
将因此包含零数量最大的行。我们忽略第一个输出,因为这将输出我们不关心的实际最大值

如果您关心速度,可以使用转换后的
true/false
矩阵执行矩阵向量乘法,向量为
one
。这样,它将为您执行求和,因此矩阵将提升到
double
精度:

[~, row] = max((mat == 0)*ones(size(mat, 2), 1)));
小调
请注意,如果有多行共享相同数量的找到的最大数量的零,此方法的限制是它将返回满足此条件的第一行。就你的目标而言,我认为这应该足够了。还要注意,如果矩阵不包含零,则此方法的输出将默认为第一行。有些情况我没有考虑,但我不确定您需要在多大程度上检查这些情况,因此为了简单起见,我将省略这些情况。

我不知道有哪种函数可以以矢量化方式(即,在我看到之前)按行执行此操作,但循环应该相当快。循环不再是很慢,因为新的引擎推出了R2016a

tmp = zeros(size(mat,1),1);
for ii = 1:size(mat,1)
    tmp(ii) = nnz(mat(ii,:));
end

作为旁注:我反对使用
I
作为变量。

我不知道有哪个函数可以以矢量化的方式(也就是说,在我看到之前)按行执行此操作,但循环应该相当快。循环不再是很慢,因为新的引擎推出了R2016a

tmp = zeros(size(mat,1),1);
for ii = 1:size(mat,1)
    tmp(ii) = nnz(mat(ii,:));
end

作为旁注:我反对使用
I
作为变量。

这种方法确实有优点,特别是对于2016a的新JIT。我投你一票。我没有考虑过nnz,很好。尽管我认为使用
I
j
不是什么大问题。我承认这是我的观点。参见@SecretAgentMan,我注意到,在最新版本的MATLAB中,使用I和j作为变量的假定速度减速实际上是不存在的。我最近一直在使用这些变量。@rayryeng,我没有测试过,但我自己使用
I
j
作为变量(索引)。我还没有发现在我的应用程序中需要改变这一点。我们中至少有两个人。这种方法确实有优点,特别是对于2016a的新JIT。我投你一票。我没有考虑过nnz,很好。尽管我认为使用
I
j
不是什么大问题。我承认这是我的观点。参见@SecretAgentMan,我注意到,在最新版本的MATLAB中,使用I和j作为变量的假定速度减速实际上是不存在的。我最近一直在使用这些变量。@rayryeng,我没有测试过,但我自己使用
I
j
作为变量(索引)。我还没有发现在我的应用程序中需要改变这一点。那我们至少有两个人。