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

Feb*_*ono 0 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]
Run Code Online (Sandbox Code Playgroud)

有人可以帮忙吗?

例如,列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 ... ]
Run Code Online (Sandbox Code Playgroud)

Meh*_*olf 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]
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

numOnesPerColumn = sum(A==1)
numOnesPerColumn =
     2  1  1  0  2  0  0  0  0  0  0  0  0  0  0  0  0
Run Code Online (Sandbox Code Playgroud)

你看,结果是一个向量,它为每一列保存了等于1的元素数量.剩下的唯一任务是找出,如果三个连续数字的总和大于2.这可以在在某些方面,例如

numOnesIn3Columns = arrayfun(@(x) sum(numOnesPerColumn(x:x+2)), ...
                             1 : length(numOnesPerColumn) - 2);
Run Code Online (Sandbox Code Playgroud)

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

numOnesIn3Columns = zeros(1, length(numOnesPerColumn) - 2);
for column = 1 : length(numOnesPerColumn) - 2
    numOnesIn3Columns(column) = sum(numOnesPerColumn(column : column + 2));
end
Run Code Online (Sandbox Code Playgroud)

或者你也可以

numOnesIn3Columns = filter(ones(1,3), 1, numOnesPerColumn);
numOnesIn3Columns = numOnesIn3Columns (1:end-2);
Run Code Online (Sandbox Code Playgroud)

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

numOnesIn3Columns =
     4  2  3  2  2  0  0  0  0  0  0  0  0  0  0
Run Code Online (Sandbox Code Playgroud)

那么,哪些列是两个以上的单元素?我们可以通过这样做轻松找到第一列的列号

find(numOnesIn3Columns > 2)
ans =
     1  3
Run Code Online (Sandbox Code Playgroud)

好的,1--3和3-5列违反了你的约束.实际上这些列中有多少个?

numOnesIn3Columns(find(numOnesIn3Columns > 2))
ans =
     4  3
Run Code Online (Sandbox Code Playgroud)

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