【问题标题】:Matlab: Get neighboring coordinate values - && OperandMatlab:获取相邻坐标值 - && 操作数
【发布时间】:2013-02-12 14:26:27
【问题描述】:

我正在尝试从具有 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 为真时,如何才能在向量的某个值中检查邻居?

谢谢!

【问题讨论】:

标签: matlab matrix coordinate operand


【解决方案1】:

我会做两件事:

首先,找到“所有邻居”,包括“非法”邻居。例如,如果索引是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 个)所有合法邻居。显然,如果您不想要“小猫角”邻居,您可以更改创建pnpm 的语句。我希望你能明白。

【讨论】:

    【解决方案2】:

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

    您遇到的第一个问题是您的数组 leftIndex 可能包含 hasLeft = hasLeft(:) & board(leftIndex)==0; 中合法使用

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

    hasLeft = find(leftIndex >= 1);
    

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-08
        • 1970-01-01
        • 2018-06-27
        • 2018-04-25
        • 2017-12-23
        • 1970-01-01
        • 2014-02-26
        • 2021-05-09
        相关资源
        最近更新 更多