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