重新表述问题:
您想知道,相邻三个列中值为 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
结果是true
和false
值的矩阵。但是,您甚至可以对这些值求和,它们将自动升级为浮点数。
numOnesPerColumn = sum(A==1)
numOnesPerColumn =
2 1 1 0 2 0 0 0 0 0 0 0 0 0 0 0 0
你看,结果是一个向量,它为每一列保存等于 1 的元素数量。剩下的唯一任务是找出三个连续数字的总和是否大于 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 个。