将所有非零矩阵元素设置为1(同时保持其他元素为0)

Tom*_*han 8 matlab matrix

我有一个网格定义为

[X, Y, Z] = meshgrid(-100:100, -100:100, 25); % z will have more values later
Run Code Online (Sandbox Code Playgroud)

和两种形状(椭圆形,在这种情况下):

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);
Run Code Online (Sandbox Code Playgroud)

现在,我想找到在非零的所有点或者椭圆形.我试过了

union = o1+o2;
Run Code Online (Sandbox Code Playgroud)

但由于我只是添加它们,重叠区域的值将为2而不是所需的值1.

如何将矩阵中的所有非零条目设置为1,而不管它们之前的值是什么?

(我试过normalized_union = union./union;,但后来我最终得到NaN所有0个元素,因为我除以零......)

abc*_*bcd 16

最简单的解决方案:A=A~=0;,A你的矩阵在哪里.

这只是执行一个逻辑操作,检查每个元素是否为零.因此,1如果元素为非零且为零,0则返回.


gno*_*ice 6

第一个建议:不要union用作变量名,因为这会影响内置函数union.我建议使用变量名称,inEitherOval因为它更具描述性......

现在,你有一个选择是做一些像abcd建议你添加矩阵的东西o1,o2并使用不等于运算符关系:

inEitherOval = (o1+o2) ~= 0;
Run Code Online (Sandbox Code Playgroud)

同一静脉中的其他几种可能性使用逻辑not运算符或函数logical:

inEitherOval = ~~(o1+o2);       % Double negation
inEitherOval = logical(o1+o2);  % Convert to logical type
Run Code Online (Sandbox Code Playgroud)

但是,最简洁的解决方案是将逻辑or运算符直接应用于o1o2:

inEitherOval = o1|o2;
Run Code Online (Sandbox Code Playgroud)

这将导致值为1,其中矩阵为非零,否则为零.