查找矩阵中最稀疏的行
Find sparsest row in matrix
我在 MATLAB 中有一个矩阵,我想确定哪一行包含的零最多。也就是说,我想找到矩阵中最稀疏的行(和列)。有什么方法比使用 mat(sum(mat==0,i)==i,:)
循环更有效吗?或者这是首选方法?
我通过使用 "minimum-degree ordering heuristic" 求解线性系统来使用它来实现 LU 分解。
要查找 "sparsest" 行,如果我对此的解释正确,则意味着您要查找零数最多的行。您可以将 sum
以矢量化方式与 max
结合使用来计算:
[~, row] = max(sum(mat == 0, 2));
mat == 0
会将整个矩阵转换为 true/false
,使得 true
为零值,而 false
否则,我们使用 sum
求和分别在每一行上。这将减少问题,使每个元素计算我们每行遇到的零元素的数量。在此结果上使用 max
的第二个输出,因此 row
将包含具有最多零的行。我们忽略第一个输出,因为这将输出我们不关心的实际最大值。
如果您关心速度,可以对转换后的 true/false
矩阵和向量 ones
执行矩阵向量乘法。这样它将为您执行求和,因此矩阵被提升到 double
精度:
[~, row] = max((mat == 0)*ones(size(mat, 2), 1)));
小注
请注意,如果有多行共享相同数量的已找到的最大数量的零,则此方法的局限性在于它将 return 首先 满足这个条件的行。就您的 objective 而言,我相信这应该足够了。另请注意,如果您的矩阵包含 无零 ,此方法的输出将默认为第一行。有一些我没有考虑到的极端情况,但我不确定你需要检查到什么程度,所以为了简单起见,我将把它们排除在外。
我不知道有什么函数可以以向量化的方式按行执行此操作(也就是说,直到我看到 ), but looping over nnz
应该相当快。循环不再很慢,因为新的发动机与 R2016a 一起问世。
tmp = zeros(size(mat,1),1);
for ii = 1:size(mat,1)
tmp(ii) = nnz(mat(ii,:));
end
附带说明:我反对使用 i
作为变量,as it denotes the imaginary unit。
我在 MATLAB 中有一个矩阵,我想确定哪一行包含的零最多。也就是说,我想找到矩阵中最稀疏的行(和列)。有什么方法比使用 mat(sum(mat==0,i)==i,:)
循环更有效吗?或者这是首选方法?
我通过使用 "minimum-degree ordering heuristic" 求解线性系统来使用它来实现 LU 分解。
要查找 "sparsest" 行,如果我对此的解释正确,则意味着您要查找零数最多的行。您可以将 sum
以矢量化方式与 max
结合使用来计算:
[~, row] = max(sum(mat == 0, 2));
mat == 0
会将整个矩阵转换为 true/false
,使得 true
为零值,而 false
否则,我们使用 sum
求和分别在每一行上。这将减少问题,使每个元素计算我们每行遇到的零元素的数量。在此结果上使用 max
的第二个输出,因此 row
将包含具有最多零的行。我们忽略第一个输出,因为这将输出我们不关心的实际最大值。
如果您关心速度,可以对转换后的 true/false
矩阵和向量 ones
执行矩阵向量乘法。这样它将为您执行求和,因此矩阵被提升到 double
精度:
[~, row] = max((mat == 0)*ones(size(mat, 2), 1)));
小注
请注意,如果有多行共享相同数量的已找到的最大数量的零,则此方法的局限性在于它将 return 首先 满足这个条件的行。就您的 objective 而言,我相信这应该足够了。另请注意,如果您的矩阵包含 无零 ,此方法的输出将默认为第一行。有一些我没有考虑到的极端情况,但我不确定你需要检查到什么程度,所以为了简单起见,我将把它们排除在外。
我不知道有什么函数可以以向量化的方式按行执行此操作(也就是说,直到我看到 nnz
应该相当快。循环不再很慢,因为新的发动机与 R2016a 一起问世。
tmp = zeros(size(mat,1),1);
for ii = 1:size(mat,1)
tmp(ii) = nnz(mat(ii,:));
end
附带说明:我反对使用 i
作为变量,as it denotes the imaginary unit。