Matlab:获取相邻坐标值-&&;操作数

Matlab:获取相邻坐标值-&&;操作数,matlab,matrix,coordinate,operand,Matlab,Matrix,Coordinate,Operand,我试图从一个id值为的二维矩阵中提取电路板上每个元素的相邻id 我有一个ID及其坐标(n个元素)的列表,我正在创建以下内容: (仅左邻居的示例) 我得到: 下标索引必须是实正整数或逻辑数 我想使用&&操作数的原理或其他一些逻辑。 leftIndex包含表中当前索引的所有索引。 有些是合法的,有些不是。如果hasLeft vector为true,则leftIndex向量值在“board”中是合法的 如果hasLeft为true,如何在向量的某个值中检查邻居 谢谢 我会做两件事: 首先,找到“所有邻

我试图从一个id值为的二维矩阵中提取电路板上每个元素的相邻id

我有一个ID及其坐标(n个元素)的列表,我正在创建以下内容: (仅左邻居的示例)

我得到: 下标索引必须是实正整数或逻辑数

我想使用&&操作数的原理或其他一些逻辑。 leftIndex包含表中当前索引的所有索引。 有些是合法的,有些不是。如果hasLeft vector为true,则leftIndex向量值在“board”中是合法的

如果hasLeft为true,如何在向量的某个值中检查邻居

谢谢

我会做两件事:

首先,找到“所有邻居”,包括“非法”邻居。例如,如果索引是
n,m
,则所有“潜在邻居”都是
[pn pm]=meshgrid(n+(-1:1),m+(-1:1))。注意,这也包括点本身

其次,根据数组的限制测试邻居的值,从而仅屏蔽“合法”邻居。如果有一个大小为N×M的二维数组,可以使用

legal = find(pn>0 && pn <= N && pm > 0 && pm <= M && ~(pn==n && pm==m));
legal=find(pn>0&&pn 0&&pm我会做两件事:

首先,找到“所有邻居”,包括“非法”邻居。例如,如果索引是
n,m
,那么所有“潜在邻居”都是
[pn pm]=meshgrid(n+(-1:1),m+(-1:1));
。注意,这也包括点本身

其次,根据数组的限制测试“合法”邻居的值,从而仅屏蔽它们

legal = find(pn>0 && pn <= N && pm > 0 && pm <= M && ~(pn==n && pm==m));

legal=find(pn>0&&pn 0&&pm更仔细地阅读您的问题,只回答您的问题(在我阅读了您最近的一些问题后,问题变得更清楚了……):

遇到的第一个问题是数组
leftIndex
可能包含<1的值,因此不能合法地用于表达式
haslef=haslef(:)&board(leftIndex)==0;

为了解决这个问题,您需要只使用“有效”索引来索引
board
,您可以通过将前一行更改为

hasLeft = find(leftIndex >= 1);
请注意,您原来的,
haslef=leftIndex>=0;
生成了一个“true”和“false”值的逻辑数组,其大小与
leftIndex
相同。相比之下,
find
命令只返回满足条件的元素的索引。现在我们还需要做两件事:1)在
board
中找到具有有效索引且值>=0的元素;2)将这些元素映射回“整体”的索引(而不是子数组中的索引)。以下是您的操作方法:

interestingSquare = (board(hasLeft)==0);
hasLeft = hasLeft(interestingSquare);
最后一行将您从“子数组‘hasleet’中一个有趣正方形的位置”返回到“相对于原始
leftIndex
数组的位置”


我确实想知道你是否真的想测试
board==0
,但我确信如果这是一个打字错误,你会发现…

更仔细地阅读你的问题,只回答你的问题(在我阅读了你最近的一些问题之后,这变得更清楚了…):

遇到的第一个问题是数组
leftIndex
可能包含<1的值,因此不能合法地用于表达式
haslef=haslef(:)&board(leftIndex)==0;

为了解决这个问题,您需要只使用“有效”索引来索引
board
,您可以通过将前一行更改为

hasLeft = find(leftIndex >= 1);
请注意,原始的,
haslef=leftIndex>=0;
生成一个逻辑数组,其中包含“true”和“false”与
leftIndex
大小相同的值。相反,
find
命令只返回满足条件的元素的索引。现在我们还需要做两件事:1)在
board
中找到具有有效索引和值>=0的元素;2)将这些映射回“整体”的索引(而不是子数组中的索引)。以下是您的操作方法:

interestingSquare = (board(hasLeft)==0);
hasLeft = hasLeft(interestingSquare);
最后一行将您从“子数组‘hasleet’中一个有趣正方形的位置”返回到“相对于原始
leftIndex
数组的位置”


我确实想知道你是否真的想测试board==0,但我确信如果这是一个打字错误,你会发现…

我解决这个问题的方法是使用“try”语句 确定索引是否合法,然后分配它(如果合法)

这是我发现的最接近于直接检查索引合法性命令的东西

下面是一段代码来说明

初始化

M=4;  N=5;             
Mat=rand(M,N);
m=2; n=1;              
代码:尝试访问此元素…仅当成功时才将该元素指定为合法邻居

near= [m,n-1;m,n+1;m+1,n;m-1,n]; 
Neibs=[];          

for i =1:4
    try
        Mat(near(i,1),near(i,2));  
        Neibs=[Neibs;[near(i,1),near(i,2)]]; 
    catch
    end
end
成果介绍

BW=zeros(M,N);
if ~isempty(Neibs)
    for i =1:length(Neibs(:,1))
        BW(Neibs(i,1),Neibs(i,2))=true;
    end
end
当然,一旦提出问题,改变尺寸,
维度或邻域度量不是问题

我解决这个问题的方法是使用“try”语句 确定索引是否合法,然后分配它(如果合法)

这是我发现的最接近于直接检查索引合法性命令的东西

下面是一段代码来说明

初始化

M=4;  N=5;             
Mat=rand(M,N);
m=2; n=1;              
代码:尝试访问此元素…仅当成功时才将该元素指定为合法邻居

near= [m,n-1;m,n+1;m+1,n;m-1,n]; 
Neibs=[];          

for i =1:4
    try
        Mat(near(i,1),near(i,2));  
        Neibs=[Neibs;[near(i,1),near(i,2)]]; 
    catch
    end
end
成果介绍

BW=zeros(M,N);
if ~isempty(Neibs)
    for i =1:length(Neibs(:,1))
        BW(Neibs(i,1),Neibs(i,2))=true;
    end
end
当然,一旦提出问题,改变尺寸,
维度或邻域metrica不是问题

另请参见。我已将项目上载到git:另请参见。我已将项目上载到git: