2011-03-07 18 views
8

ho una griglia maglia definitaimpostare tutti gli elementi di matrice diversi da zero a 1 (mantenendo gli altri 0)

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

e due forme (ovali, in questo 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); 

Ora , Voglio trovare tutti i punti non nulli nello o nell'ovale. Ho provato

union = o1+o2; 

ma poiché semplicemente aggiungo, la regione di sovrapposizione avrà un valore di 2 invece del desiderato 1.

Come si imposta tutte elementi non nulli nella matrice a 1, indipendentemente dal loro valore precedente?

(I provato normalized_union = union./union;, ma poi finiscono con NaN in tutti 0 elementi perché sto divisione per zero ...)

risposta

15

soluzione più semplice: A=A~=0;, dove A e il matrice.

Questo esegue solo un'operazione logica che verifica se ogni elemento è zero. Quindi restituisce 1 se l'elemento è diverso da zero e 0 se è zero.

+0

Perfetto, grazie! Sei stato così veloce, SO non mi ha lasciato segnare la tua risposta come accettata fino ad altri 6 minuti: P –

6

Primo suggerimento: non utilizzare union come nome di variabile, dal momento che ombreggia la funzione integrata union. Io suggerirei di utilizzare il nome della variabile inEitherOval invece dal momento che è più descrittivo ...

Ora, un'opzione che avete è quella di fare qualcosa di simile a ciò che abcd suggests in cui si aggiungono le vostre matrici o1 e o2 e utilizzare il relational not equal to operator:

inEitherOval = (o1+o2) ~= 0; 

Un paio di altre possibilità nella stessa vena usa la logica not dell'operatore o la funzione logical:

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

Tuttavia, la soluzione più semplice è quello di applicare il or operatore logico direttamente o1 e o2:

inEitherOval = o1|o2; 

che si tradurrà in un valore di 1 in cui o matrice è non-zero e zero altrimenti.

+0

'union' era solo una cosa che ho trovato in questa domanda - nel mio codice attuale ho nome variabile che corrisponde a ciò gli ovali rappresentano, quindi non c'è un problema. Grazie per tutti i buoni suggerimenti! –

2

C'è un'altra soluzione semplice, A = logica (A)

Problemi correlati