我正在尝试识别在此矩阵中具有> 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 ... ]
答案 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
结果是true
和false
值的矩阵。但是,您甚至可以对这些值求和,它们将自动提升为浮点数。
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