如何从包含超过50%零的MATLAB的矩阵中删除行

时间:2017-04-27 20:41:19

标签: arrays matlab matrix

我想删除包含超过50%空元素的数组中的行。

例如: 如果输入是

1 0 0 0 5 0
2 3 5 4 3 1
3 0 0 4 3 0
2 0 9 8 2 1
0 0 4 0 1 0 

我想删除第1行和第5行,但保留其余部分。输出应如下所示:

2 3 5 4 3 1
3 0 0 4 3 0
2 0 9 8 2 1

我想用matlab

来做这件事

3 个答案:

答案 0 :(得分:3)

根据A行的平均值,对行使用逻辑索引:

t = .5; % threshold
A(mean(A==0,2) > t, :) = [];

这是做什么的:

  • A0进行比较:将零变为true,将非零变为false
  • 计算每行的平均值。
  • 将其与所需的阈值进行比较。
  • 将结果用作逻辑索引以删除不需要的行。

等效地,您可以保留所需的行,而不是删除不需要的行。这可能会更快,具体取决于行的比例:

A = A(mean(A~=0,2) >= 1-t, :);

答案 1 :(得分:0)

您还可以同时使用standardizeMissing functionrmmissing function来实现此目标:

>> [~,tf] = rmmissing(standardizeMissing(A,0),'MinNumMissing',floor(0.5*size(A,2))+1);
>> A(~tf,:)

standardizeMissing的调用将0值替换为NaN(标准缺失指标为double),然后rmmissing调用在逻辑向量中标识{{1具有超过50%条目的行为tf(即那些具有超过0 0值条目的行。然后您可以否定floor(0.5*size(A,2))+1输出并将其用作索引器。您可以轻松调整丢失的最小数量,以满足您想要的任何百分比标准。

另请注意,此处tf是一个逻辑向量,它只是tf行数的大小。

答案 2 :(得分:0)

正如我mentioned on Luis' answer,他的方法的一个缺点是它需要创建与A相同大小的中间逻辑数组,这可能会在工作时产生显着的内存/性能损失大阵列。

使用nnz的明确循环方法(为了清晰起见,过于冗长):

[nrows, ncols] = size(A);
maximum_ratio_of_zeros = 0.5;
minimum_ratio_of_nonzeros = 1 - maximum_ratio_of_zeros;
todelete = false(nrows, 1);
for ii = 1:nrows
    if nnz(A(ii,:))/ncols < minimum_ratio_of_nonzeros
        todelete(ii) = true;
    end
end
A(todelete,:) = [];

返回所需答案。