我有一个定义为
的网格[X, Y, Z] = meshgrid(-100:100, -100:100, 25); % z will have more values later
和两个形状(在这种情况下是椭圆形):
x_offset_1 = 40;
x_offset_2 = -x_offset_1;
o1 = ((X-x_offset_1).^2./(2*Z).^2+Y.^2./Z.^2 <= 1);
o2 = ((X-x_offset_2).^2./(2*Z).^2+Y.^2./Z.^2 <= 1);
现在,我想找到 椭圆形中非零的所有点。我试过了
union = o1+o2;
但由于我只是添加它们,重叠区域的值将为2而不是所需的值。
如何将矩阵中的所有非零条目设置为1,而不管它们之前的值是什么?
(我尝试了normalized_union = union./union;
,但后来我在所有0个元素中都得到NaN
,因为我将其除以零...)
答案 0 :(得分:16)
最简单的解决方案:A=A~=0;
,其中A
是您的矩阵。
这只执行一个逻辑操作,检查每个元素是否为零。因此,如果元素为非零,则返回1
;如果元素为零,则返回0
。
答案 1 :(得分:6)
第一个建议:不要将union
用作变量名,因为这会影响内置函数union
。我建议使用变量名inEitherOval
,因为它更具描述性......
现在,您可以选择执行o1
和o2
添加abcd suggests的relational not equal to operator内容,并使用not
:
inEitherOval = (o1+o2) ~= 0;
同一静脉中的其他两种可能性使用逻辑logical
运算符或函数or
:
inEitherOval = ~~(o1+o2); % Double negation
inEitherOval = logical(o1+o2); % Convert to logical type
但是,最简洁的解决方案是将逻辑{{3}}运算符直接应用于o1
和o2
:
inEitherOval = o1|o2;
这将导致值为1,其中任一矩阵为非零,否则为零。
答案 2 :(得分:2)
还有另一个简单的解决方案,A =逻辑(A)