matlab中的矩阵行/列操作

时间:2016-08-15 15:18:44

标签: matlab networking matrix

我有以下函数用于在矩阵中展开1的数量,如果有全部为0或全1的行,则必须删除该特定行

function ReducedMatrix = ReduceMatrix(result)
D1 = sum(result(:));
NumberOfOnes = floor(D1*0.3);
NewMatrix = zeros(size(result));
NewMatrix(randi(numel(NewMatrix),1,NumberOfOnes)) = 1;
ReducedMatrix = NewMatrix;
while numel(ReducedMatrix)/numel(NewMatrix) > 0.2
IndexOfFullRows = find(all(ReducedMatrix));
if isempty(IndexOfFullRows)

    break
end
ReducedMatrix(:,IndexOfFullRows(1)) = [];

end
end

功能和输出的输入如下

 result =

 0     1     1     1     1     1     1     1     1     1
 1     1     1     1     1     0     1     0     1     1
 1     1     0     1     1     1     1     1     1     1
 1     1     1     1     1     1     1     1     1     0
 1     1     1     1     1     1     0     1     0     1
 1     0     1     1     1     1     1     0     1     1
 1     1     1     1     0     1     1     1     0     1
 1     0     1     1     1     0     1     1     1     1
 1     1     1     1     0     1     0     1     1     1
 1     1     1     0     1     1     1     1     1     1


 ReducedMatrix =

 0     1     1     0     0     0     0     0     1     0
 0     1     0     0     0     0     0     1     0     0
 1     1     1     0     0     0     0     0     0     0
 0     0     0     1     0     0     1     0     0     0
 0     0     0     0     0     0     1     0     0     0
 0     1     0     0     0     0     1     0     1     1
 1     0     1     0     0     0     0     0     0     0
 0     0     0     0     0     0     0     1     0     1
 0     0     0     0     0     0     0     0     0     0
 1     0     1     0     0     0     0     0     0     1


row_sum =

 3
 2
 3
 2
 1
 4
 2
 2
 0
 3


col_sum =

 3     4     4     1     0     0     3     2     2     3

现在,如果存在row_sum / col_sum等于0或1的行或列,则必须删除相应的行。 例如。 Row-R4,R9和Col-C4,C5,C6具有row_sum和col_sum为1,0。因此,必须从矩阵中添加R4,R9,C4,C5,C6 = 5行,因此我的简化矩阵的大小应为5x5。请注意,不应删除列,而是删除具有0和1的列,而不是删除相应的行。类似地,该函数必须运行具有相同约束的较大矩阵。我尝试了上述功能,但是我没有足够的技能来达到我想要的效果,非常感谢任何帮助

1 个答案:

答案 0 :(得分:0)

我发现您的代码存在许多潜在问题和可能的简化。

首先,构建原始矩阵的方式NewMatrix(randi(numel(NewMatrix),1,NumberOfOnes)) = 1;可能不会像您期望的那样运行。 randi不保证同一索引不会在输出中多次出现,因此您的新矩阵可能比原始矩阵少。要解决此问题,请使用randperm

对元素进行随机播放
ReducedMatrix = [ones(1, NumberOfOnes), zeros(1, numel(result) - NumberOfOnes)];
ReducedMatrix = ReducedMatrix(randperm(numel(ReducedMatrix)));
ReducedMatrix = reshape(ReducedMatrix, size(result));

其次,您不需要将新矩阵构造为NewMatrix,然后将其重新分配给ReducedMatrix = NewMatrix;。只需ReducedMatrix = zeros(size(result));并跳过重新分配。对于while循环条件,其中NewMatrix似乎是"已使用",请记住numel(NewMatrix) == numel(result)

如果您不删除同类列,只删除行,则不需要循环来执行删除:

rowSum = sum(ReducedMatrix, 2);
rowMask = (rowSum == size(ReducedMatrix, 2) | rowSum == 0);
ReducedMatrix(rowMask, :) = [];

您的原始代码似乎在删除行时交换行和列索引。它也没有处理全零的情况。如果要删除不超过30%的行,可以在删除之前执行以下操作:

rowMask = find(rowMask); % Convert to indices
rowMask = rowMask(1:min(numel(rowMask), round(0.3 * size(ReducedMatrix, 2))));