A=[1 2 3 4 5 0 0 0 0 0 0 0 0 0 0 0 0;
0 1 2 3 4 5 0 0 0 0 0 0 0 0 0 0 0;
0 0 0 1 2 3 4 5 0 0 0 0 0 0 0 0 0;
0 0 0 0 0 0 0 0 0 0 0 0 1 2 3 4 5;
0 0 0 0 0 0 0 1 2 3 4 5 0 0 0 0 0;
0 0 0 0 0 0 0 1 2 3 4 5 0 0 0 0 0];
在列中只计算数字“1”的代码是什么,只有元素的值大于1且小于4.
注意:忽略零。
因此,我的预期输出为res = 1
,仅在第二列。
以下是我的尝试:
res = sum( sum(A(2 :end,all(A>1&A<4))==1, 2),1 );
但我的代码中仍然计算零。
答案 0 :(得分:1)
如果我理解正确,你可以这样做:
首先查找违反第一条规则的所有列A
我的元素不大于4
[~, del, ~] = find(A>=4)
删除这些列:
A(:, unique(del)) = []
给出了:
A =
1 2 3 0 0 0 0 0
0 1 2 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 1 2 3
0 0 0 2 3 0 0 0
0 0 0 2 3 0 0 0
现在我们找到所有剩余的列1
:
[~, c1, ~] = find(A == 1);
在第二个要求之后,所有至少有一个值大于1
的列:
[~, c2, ~] = find(A > 1)
这些带有列号的c1
和c2
矢量我们只需相交并计算:
numel(intersect(c1, c2))
现在这个论坛上有很多Matlab向导,我的直觉告诉我有更好的答案,所以也许你应该等一下。