Matlab 如何使用if-else语句选择不同矩阵中的元素?

Matlab 如何使用if-else语句选择不同矩阵中的元素?,matlab,if-statement,Matlab,If Statement,我已经被困在以下问题上好几天了,如果有任何帮助,我将不胜感激。我有两个不同的矩阵,A和B。我有一个起始的x和y位置(xpos,ypos),首先,我想确定在某个范围内是否有一个元素在矩阵B中的值为“0”。如果有这样的元素,我想这个元素的x和y位置是新的x和y位置。如果没有任何值为“0”的元素,我想从矩阵a中的起始位置选择在一定范围内具有最高值的元素。该位置和该元素随后成为新的x和y位置。我有以下代码: for i=1:5 range=5 xpos=100 ypos=100

我已经被困在以下问题上好几天了,如果有任何帮助,我将不胜感激。我有两个不同的矩阵,A和B。我有一个起始的x和y位置(xpos,ypos),首先,我想确定在某个范围内是否有一个元素在矩阵B中的值为“0”。如果有这样的元素,我想这个元素的x和y位置是新的x和y位置。如果没有任何值为“0”的元素,我想从矩阵a中的起始位置选择在一定范围内具有最高值的元素。该位置和该元素随后成为新的x和y位置。我有以下代码:

for i=1:5
    range=5
    xpos=100
    ypos=100
    xstart=xpos-range
    ystart=ypos-range

    for gg=1:10; %double the range
        for hh=1:10;

            if  ystart+gg <= 652 && ystart+gg>0 && xstart+hh <= 653 &&  xstart+hh> 0 &&  B(xstart+hh,ystart+gg)== 0;

                xpos = xstart+hh %this becomes the new xposition
                ypos = ystart+gg

            else

                if  ystart+gg <= 652 && ystart+gg >0 && xstart+hh <= 653 && xstart + hh >0 && B(xstart+hh,ystart+gg)~= 0;

                    if  ystart+gg <= 652 && ystart +gg>0 && xstart+hh <= 653 && xstart+hh>0 && A(ystart + gg, xstart +hh) >= 0.0;
                        maxtreecover = A(ystart + gg, xstart + hh)

                        xpos = xstart + gg %this becomes the new xpos
                        ypos = ystart + hh %this becomes the new ypos

                    end
                end
            end
        end
    end
end
i=1:5时的

范围=5
xpos=100
ypos=100
xstart=xpos范围
ystart=ypos范围
对于gg=1:10;%双倍射程
对于hh=1:10;
如果ystart+gg0&&xstart+hh0&&B(xstart+hh,ystart+gg)==0;
xpos=xstart+hh%这将成为新的xposition
ypos=ystart+gg
其他的
如果ystart+gg 0&&xstart+hh 0&&B(xstart+hh,ystart+gg)~=0;
如果ystart+gg 0&&xstart+hh 0&&A(ystart+gg,xstart+hh)>=0.0;
maxtreecover=A(ystart+gg,xstart+hh)
xpos=xstart+gg%这将成为新的xpos
ypos=ystart+hh%这将成为新的ypos
结束
结束
结束
结束
结束
结束

这样做的问题是,在搜索a矩阵之前,它不会搜索范围内的所有元素以查找“0”(在B矩阵中)。如何修改此代码以反映我的意图?

这里是对代码的重新编写,避免了双循环。我假设所有的
if
条件都使索引保持有效(介于1和矩阵大小之间),但它们不会以当前形式工作,因为索引是在同一行中完成的!我还使用
xpos
ypos
上的
min
max
条件解决了这个问题

此解决方案获取子矩阵,该子矩阵跨越
xpos
ypos
的+/-范围。然后评估您在该子矩阵中描述的两个条件:

  • 获取
    B
    的第一个元素的位置,该元素为零
  • 获取一个元素的最大元素的位置
有关详细信息,请参见代码注释:

% Create matrices A and B
n = 100; % Size of matrices
A = rand(n);
B = rand(n);
range = 5;            % "radius" of submatrix
xpos = 50; ypos = 50; % start point

% Iterate
for ii = 1:5
    % Get submatrices around xpos and ypos, using min and max to ensure valid
    subx = max(1,xpos-range):min(n,xpos+range);
    suby = max(1,ypos-range):min(n,ypos+range);
    A_sub = A(suby, subx);
    B_sub = B(suby, subx);
    % Find first 0 in submatrix of B, re-assign xpos/ypos if so
    [yidx, xidx] = find(B_sub == 0, 1);
    if ~isempty(xidx)
        xpos = subx(xidx);
        ypos = suby(yidx);
    else
        % Get max from submatrix of A
        [~, idx] = max(A_sub(:));
        [xidx, yidx] = meshgrid(subx, suby);
        xpos = xidx(idx);
        ypos = yidx(idx);
    end
end

非常感谢。仍然试图理解这一切,但是为什么“find(B_sub==0,1)”有“0,1”?为什么“find(B_sub==0)”不够?没问题
B_sub==0
是我们想要
查找的条件,因此这就解释了
0
!然后
1
表示您只对第一个匹配感兴趣。因此,如果子矩阵有5个零,它将只返回第一个零的索引。这是因为我们只能将
xpos
ypos
分别重新分配给一个值!我也为我的懒惰变量命名道歉,我认为我使用“rows”和“cols”可能会让事情变得混乱。
~isempty
行后面还有一个打字错误。我已经更新了我的代码以获得更好的清晰度,并且它似乎在测试中按照预期工作。如果有任何疑问,请让我知道……谢谢,我知道了!你能简单解释一下“if~isempty(xidx)”是如何工作的吗?我知道这是为了找到第一个零,但我不明白为什么只提到“xidx”而不提到“yidx”。不用担心,这段代码比我现在的代码复杂得多(可能是优雅这个词),所以对于可能有明显答案的问题,我深表歉意!