0

我正在尝试从具有 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 向量为真,则 leftIndex 向量值在“板”中是合法的。

仅当 hasLeft 为真时,如何检查向量的某个值中的邻居?

谢谢!

4

3 回答 3

2

我会做两件事:

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

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

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

这应该给你(最多 8 个)所有合法邻居。显然,如果您不想要“小猫角”邻居,您可以更改创建pnand的语句pm。我希望你能明白。

于 2013-02-26T22:52:52.267 回答
1

我解决这个问题的方法是使用“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

当然,一旦确定了这一点,改变大小、尺寸或邻域度量就不是问题了

于 2014-06-05T04:23:11.977 回答
1

更仔细地阅读您的问题,并仅回答您的要求(在我阅读了您最近的一些其他问题后,这变得更加清晰......):

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

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

hasLeft = find(leftIndex >= 1);

请注意,您的原始文件会hasLeft = leftIndex >= 0;生成与leftIndex. 相比之下,该find命令仅返回满足条件的元素的索引。现在我们还需要做两件事: 1) 找到board具有有效索引且值 >=0 的元素;2)将这些映射回“整个事物”的索引(不是子数组中的索引)。这是您的操作方法:

interestingSquare = (board(hasLeft)==0);
hasLeft = hasLeft(interestingSquare);

最后一行将您从“子数组'hasLeft'中有趣正方形的位置”带回到“相对于原始leftIndex数组的位置。

我确实想知道您是否真的打算进行测试,board == 0但我敢肯定,如果这是一个错字,您会弄清楚的...

于 2013-02-27T22:23:10.000 回答