0

我正在尝试识别在此矩阵中具有 >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 ... ]
4

2 回答 2

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

你看,结果是一个向量,它为每一列保存等于 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 个。

于 2012-08-27T13:58:41.503 回答
1

A one line solution:

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

Result:

found =

     1     0     1     0     0     0     0     0     0     0     0     0     0     0     0
于 2012-08-27T11:48:06.483 回答