Установите все ненулевые матричные элементы в 1 (оставив остальные 0) - PullRequest
8 голосов
/ 08 марта 2011

У меня сетка определена как

[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.

Как мне установить все ненулевые записи в матрице на 1, независимо от их предыдущего значения?

(я пробовал normalized_union = union./union;, но потом я получаю NaN во всех 0 элементах, потому что делю на ноль ...)

Ответы [ 3 ]

16 голосов
/ 08 марта 2011

Самое простое решение: A=A~=0;, где A - ваша матрица.

Это просто выполняет логическую операцию, которая проверяет, равен ли каждый элемент нулю. Таким образом, возвращается 1, если элемент не равен нулю, и 0, если он равен нулю.

6 голосов
/ 08 марта 2011

Первое предложение: не используйте union в качестве имени переменной, так как это затеняет встроенную функцию union.Я бы предложил вместо этого использовать имя переменной inEitherOval, поскольку оно более наглядно ...

Теперь у вас есть один вариант - сделать что-то вроде того, что abcd предлагает , в который вы добавляетематрицы o1 и o2 и используют реляционный , не равный оператору :

inEitherOval = (o1+o2) ~= 0;

Пара других возможностей в том же духе использует логический not оператор или функция logical:

inEitherOval = ~~(o1+o2);       % Double negation
inEitherOval = logical(o1+o2);  % Convert to logical type

Однако наиболее кратким решением является применение логического оператора or непосредственно к o1 и o2:

inEitherOval = o1|o2;

Что приведет к значению 1, где любая матрица не равна нулю, а в противном случае равна нулю.

2 голосов
/ 12 июля 2014

Существует еще одно простое решение, A = логическое (A)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...