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

时间:2011-03-07 23:21:19

标签: matlab matrix

我有一个定义为

的网格
[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,因为我将其除以零...)

3 个答案:

答案 0 :(得分:16)

最简单的解决方案:A=A~=0;,其中A是您的矩阵。

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

答案 1 :(得分:6)

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

现在,您可以选择执行o1o2添加abcd suggestsrelational 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}}运算符直接应用于o1o2

inEitherOval = o1|o2;

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

答案 2 :(得分:2)

还有另一个简单的解决方案,A =逻辑(A)