如何识别每三列的值1的数量

时间:2012-08-27 11:24:47

标签: matlab

我正在尝试识别在此矩阵中具有> 2个“1”实例的连续三列组。

A=[1 2 3 4 5 6 7 8 9 10 11 0 0 0 0 0 0;
   0 1 2 3 4 5 6 7 8 9 10 11 0 0 0 0 0;
   0 0 0 0 1 2 3 4 5 6 7 8 9 10 11 0 0;
   1 2 3 4 5 6 7 8 9 10 11 0 0 0 0 0 0;
   0 0 1 2 3 4 5 6 7 8 9 10 11 0 0 0 0;
   0 0 0 0 1 2 3 4 5 6 7 8 9 10 11 0 0]

有人可以帮忙吗?

例如,列1-3具有4个“1”的实例(> 2);列2-4只有2个“1”的实例(不是> 2);列3-5具有3个“1”(> 2)的实例。剩余的三列组中没有一个具有> 2个“1”的实例。所以期望的结果将是

[1 0 1 0 0 0 0 0 ... ]

2 个答案:

答案 0 :(得分:5)

重新提出问题: 您想知道,如果三个相邻列中值为1的矩阵元素的数量大于2。

我们假设你有一个矩阵

A = [1 2 3 4 5 6 7 8 9 10 11 0 0 0 0 0 0;
     0 1 2 3 4 5 6 7 8 9 10 11 0 0 0 0 0;
     0 0 0 0 1 2 3 4 5 6 7 8 9 10 11 0 0;
     1 2 3 4 5 6 7 8 9 10 11 0 0 0 0 0 0;
     0 0 1 2 3 4 5 6 7 8 9 10 11 0 0 0 0;
     0 0 0 0 1 2 3 4 5 6 7 8 9 10 11 0 0]

如果元素满足某些条件,您可以使用二元运算符轻松比较,例如:让我们测试,如果矩阵元素等于1:

A == 1
ans =
     1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
     0  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
     0  0  0  0  1  0  0  0  0  0  0  0  0  0  0  0  0
     1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
     0  0  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0
     0  0  0  0  1  0  0  0  0  0  0  0  0  0  0  0  0

结果是truefalse值的矩阵。但是,您甚至可以对这些值求和,它们将自动提升为浮点数。

numOnesPerColumn = sum(A==1)
numOnesPerColumn =
     2  1  1  0  2  0  0  0  0  0  0  0  0  0  0  0  0

你看,结果是一个向量,它为每一列保存了元素的数量 如果三个连续数字的总和大于2,那么剩下的唯一任务就是找出。这可以在很多方面完成,例如。

numOnesIn3Columns = arrayfun(@(x) sum(numOnesPerColumn(x:x+2)), ...
                             1 : length(numOnesPerColumn) - 2);

使用循环的另一种方法(可能更容易为Matlab初学者编写):

numOnesIn3Columns = zeros(1, length(numOnesPerColumn) - 2);
for column = 1 : length(numOnesPerColumn) - 2
    numOnesIn3Columns(column) = sum(numOnesPerColumn(column : column + 2));
end

或者你也可以

numOnesIn3Columns = filter(ones(1,3), 1, numOnesPerColumn);
numOnesIn3Columns = numOnesIn3Columns (1:end-2);

结果是所有情况下包含三个连续元素之和的向量:

numOnesIn3Columns =
     4  2  3  2  2  0  0  0  0  0  0  0  0  0  0

那么,哪些列是两个以上的单元素?我们可以很容易地找到列号 通过执行

中的第一列
find(numOnesIn3Columns > 2)
ans =
     1  3

好的,第1--3和3-5列违反了您的约束条件。实际上这些列中有多少个?

numOnesIn3Columns(find(numOnesIn3Columns > 2))
ans =
     4  3

所以第1--3列有4个,列3--5有3个。

答案 1 :(得分:1)

一线解决方案:

A=[1 2 3 4 5 6 7 8 9 10 11 0 0 0 0 0 0;
   0 1 2 3 4 5 6 7 8 9 10 11 0 0 0 0 0;
   0 0 0 0 1 2 3 4 5 6 7 8 9 10 11 0 0;
   1 2 3 4 5 6 7 8 9 10 11 0 0 0 0 0 0;
   0 0 1 2 3 4 5 6 7 8 9 10 11 0 0 0 0;
   0 0 0 0 1 2 3 4 5 6 7 8 9 10 11 0 0];

found = conv(sum(A ==1), [1 1 1], 'valid') > 2

结果:

found =

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