我正在尝试识别在此矩阵中具有> 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)
重新提出问题: 您想知道,如果三个相邻列中值为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)
结果是矩阵true和false值.但是,您甚至可以对这些值求和,它们将自动提升为浮点数.
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个.