我的矩阵 D 如下:
D=[
1 2
3 4
5 6
]
我想要做的是测试(ii,jj)
位置的坐标是否属于 D 中的一行。
换句话说,我有一个for循环,在其中,如果验证“(ii& jj)”的条件属于 D 的行,我想将变量增加1 “ 是真的。
例如,我们可以手动执行此操作:
var = 0;
for ii = 1: 20
for jj = 1:30
if((ii==1 && jj==2) || (ii==3 && jj==4) || (ii==5 && jj==6))
var = var + 1;
end
end
end
这很简单,因为矩阵 D 仅包含3
行。但在我的工作中,我有大约1000
行,所以 D 的大小为1000*2
。在这种情况下,我必须找到一种方法,它可以完成我上面所写的相同工作,但是会以非常快的方式自动完成。但是怎么样?
事实上,人们可以考虑使用ismember
,例如:
var = 0;
for ii = 1 : 20
for jj = 1 : 30
if(ismember(ii, D(:,1)) && ismember(jj, D(:,2)))
var = var + 1;
end
end
end
但这不正确,因为例如,上面的代码可以找到ii=1
和jj=6
,但在这种情况下,(ii,jj)
将是(1,6)
,而且不属于任何(1,2)
,(3,4)
和(5,6)
。
拜托,非常感谢任何帮助!
答案 0 :(得分:3)
您可以使用'rows'
输入到ismember
来检查您的数组是否是矩阵中的一行
tf = ismember([ii,jj], D, 'rows');
您还可以一次检查ii
和jj
的多个值
% Create all permutations of ii and jj
[ii,jj] = ndgrid(1:20, 1:30);
% Test all of these permutations to see which ones are in D
tf = ismember([ii(:), jj(:)], D, 'rows');
然后计算var
var = sum(tf);
如果您正在处理非整数,则应使用ismembertol
来处理可能的浮点错误。