测试坐标(x,y)是否在矩阵内

时间:2017-01-29 18:30:14

标签: matlab matrix

我的矩阵 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=1jj=6,但在这种情况下,(ii,jj)将是(1,6),而且不属于任何(1,2)(3,4)(5,6)

拜托,非常感谢任何帮助!

1 个答案:

答案 0 :(得分:3)

您可以使用'rows'输入到ismember来检查您的数组是否是矩阵中的一行

tf = ismember([ii,jj], D, 'rows');

您还可以一次检查iijj的多个值

% 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来处理可能的浮点错误。