我正在尝试从一个二维矩阵中提取,其中id值是板上每个元素的相邻ID。
我有一个ID列表及其坐标(n个元素),我正在创建以下内容: (仅左邻居的示例)。
%Left:
leftIndex = (currentLocationIndex - bSize);
hasLeft = leftIndex >= 1; %If element on first col, value will be 0 or negative
hasLeft = hasLeft(:) & board(leftIndex)==0;
我得到: 下标索引必须是实数正整数或逻辑。
我想使用&&和操作数或其他一些逻辑。 leftIndex包含表中当前索引的所有索引。 有些是合法的,有些不合法。如果hasLeft向量为true,则leftIndex向量值在'board'中是合法的。
只有当hasLeft为真时,如何检查向量的某个值中的邻居?
谢谢!
答案 0 :(得分:2)
我会做两件事:
首先,找到“所有邻居”,包括“非法”邻居。例如,如果索引是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));
这应该给你(最多8个)所有合法邻居。显然,如果您不想要“kitty corner”邻居,则更改创建pn
和pm
的语句。我希望你明白这一点。
答案 1 :(得分:1)
更仔细地阅读你的问题,并回答你所要求的问题(在我阅读了你最近的其他一些问题之后,这一点变得更加清晰......):
您遇到的第一个问题是您的数组leftIndex
可能包含值&lt; 1,因此不能合法地用在表达式hasLeft = hasLeft(:) & board(leftIndex)==0;
要解决这个问题,你需要只使用“有效”索引来索引board
,你可以通过将前一行更改为
hasLeft = find(leftIndex >= 1);
请注意,您的原始hasLeft = leftIndex >= 0;
会生成与leftIndex
大小相同的“true”和“false”逻辑数组。相反,find
命令仅返回符合条件的元素的索引。现在我们需要做两件事:1)找到board
中具有有效索引和值&gt; = 0的元素; 2)将这些映射回“整个事物”的索引(而不是子阵列中的索引)。这是你如何做到的:
interestingSquare = (board(hasLeft)==0);
hasLeft = hasLeft(interestingSquare);
最后一行将您从“子阵列'hasLeft'中的一个有趣方块的位置”转回“相对于原始leftIndex
数组的位置。
我确实想知道你是否真的打算为board == 0
进行测试,但我确信如果这是一个错字,你会想出来的......
答案 2 :(得分:1)
我解决此问题的方法是使用“try”语句 如果索引是合法的,那么就会阻止它,如果是,那么就分配它。
这是我发现的最直接的检查索引合法性命令。
这是一个代码来说明
初始化
M=4; N=5;
Mat=rand(M,N);
m=2; n=1;
代码:尝试访问此元素...仅在Succeeded
时将元素指定为合法邻居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
当然,一旦提出要点,改变大小, 维度或邻域度量不是问题