Matlab 如何使用if-else语句选择不同矩阵中的元素?
我已经被困在以下问题上好几天了,如果有任何帮助,我将不胜感激。我有两个不同的矩阵,A和B。我有一个起始的x和y位置(xpos,ypos),首先,我想确定在某个范围内是否有一个元素在矩阵B中的值为“0”。如果有这样的元素,我想这个元素的x和y位置是新的x和y位置。如果没有任何值为“0”的元素,我想从矩阵a中的起始位置选择在一定范围内具有最高值的元素。该位置和该元素随后成为新的x和y位置。我有以下代码: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
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”。不用担心,这段代码比我现在的代码复杂得多(可能是优雅这个词),所以对于可能有明显答案的问题,我深表歉意!