matrices - vector matlab
Establezca todos los elementos de la matriz distintos de cero en 1(manteniendo los otros 0) (3)
Tengo una malla definida como
[X, Y, Z] = meshgrid(-100:100, -100:100, 25); % z will have more values later
y dos formas (óvalos, en este caso):
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);
Ahora, quiero encontrar todos los puntos que sean distintos de cero en cualquiera de los dos . Lo intenté
union = o1+o2;
pero como simplemente los agrego, la región superpuesta tendrá un valor de 2 en lugar del 1 deseado.
¿Cómo puedo establecer todas las entradas distintas de cero en la matriz en 1, independientemente de su valor anterior?
(Intenté normalized_union = union./union;
pero luego termino con NaN
en los 0 elementos porque estoy dividiendo por cero ...)
La solución más simple: A=A~=0;
, donde A
es tu matriz.
Esto solo realiza una operación lógica que verifica si cada elemento es cero. Entonces devuelve 1
si el elemento es distinto de cero y 0
si es cero.
Hay otra solución simple, A = lógica (A)
Primera sugerencia: no use union
como nombre de variable, ya que sombreará la union
función incorporada. Sugeriría usar el nombre de la variable en inEitherOval
en inEitherOval
lugar, ya que es más descriptivo ...
Ahora, una opción que tienes es hacer algo como lo que sugiere abcd en el que agregas tus matrices o1
y o2
y usas el operador relacional no igual a :
inEitherOval = (o1+o2) ~= 0;
Un par de otras posibilidades en el mismo sentido usan el operador lógico not
o la función logical
:
inEitherOval = ~~(o1+o2); % Double negation
inEitherOval = logical(o1+o2); % Convert to logical type
Sin embargo, la solución más sucinta es aplicar el operador lógico or
operador directamente a o1
y o2
:
inEitherOval = o1|o2;
Lo que dará como resultado un valor de 1 donde cualquiera de las matrices es distinta de cero y cero de lo contrario.