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

时间:2013-02-26 22:47:39

标签: matlab matrix coordinate operand

我正在尝试从一个二维矩阵中提取,其中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为真时,如何检查向量的某个值中的邻居?

谢谢!

3 个答案:

答案 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”邻居,则更改创建pnpm的语句。我希望你明白这一点。

答案 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

当然,一旦提出要点,改变大小, 维度或邻域度量不是问题