2013-04-18 8 views
6

Ho un semplice problema che sto cercando un'implementazione veloce in Matlab. Ho una matrice di valori, diciamo:Operandi per || e gli operatori && devono essere convertibili in valori scalari logici

a = floor(rand(5,5).*255) 

Poi hanno una matrice soglia di dimensioni simili, diciamo è:

a_thresh = floor(rand(5,5).*255) 

Per valori all'interno a se sono 0,5x minore della corrispondente valore nel a_thresh voglio l'uscita sia 0 - allo stesso modo per il valore 1,2x in a_thresh dovrebbe essere impostato a zero, vale a dire :

a(a < a_thresh.*0.4) = 0 
a(a > a_thresh.*1.2) = 0 

Per valori compresi tra 0,4x e 0,5x e 1,0x e 1,2x, desidero un valore proporzionale e inoltre, dove tra 0,5 e 1,0, non viene modificato il valore di a. Ho pensato che avrei potuto usare qualcosa come il seguente:

a(a>= a_thresh .* 0.4 && a <a_thresh.* 0.5) = ((a - a_thresh.*0.4)/(a_thresh.*0.5 a_thresh.*0.4)) .* a; 

Tuttavia, ottengo un errore che dice:

Operandi a || e & & operazioni devono essere convertibile in scalare logica valori

Qualche consiglio su come risolvere questo problema? Ovviamente potrei usare loop per farlo e sarebbe banale, ma voglio mantenere il codice vettorializzato.

risposta

14

La cosa di && è che può operare solo su scalari, mentre & può operare su array pure. È necessario modificare && in & per farlo funzionare (puoi leggere ulteriori informazioni a riguardo in this question).

Aggiornamento:
Per quanto riguarda il secondo problema descritto in un commento: il numero di elementi a sinistra è diverso perché si sta utilizzando indici (selezionando solo alcuni elementi), e sulla destra si sta lavorando l'intera matrice a e a_thresh.

devi usare indici in entrambi i lati, così suggeriscono memorizzandolo in una variabile e quindi utilizzarlo come un indice di matrice, lungo queste linee:

idx = (a >= a_thresh*0.4 & a < a_thresh*0.5); 
a(idx) = ((a(idx)-a_thresh(idx)*0.4) ./ (a_thresh(idx)*0.5*a_thresh(idx)*0.4)) .* a(idx); 

non sono sicuro se il calcolo stesso è corretto, quindi lo lascerò a voi per controllare.

+0

Fantastico - che affronta il problema &/&& - Io un po 'come non lo sapevo, grazie! Ora ho un piccolo problema che il numero di elementi a destra è diverso da sinistra. C'è un modo intelligente per risolvere questo? – trican

+0

@trican L'ho risolto, si prega di consultare l'aggiornamento. –

+1

Molte, molte grazie Eitan - la tua soluzione funziona perfettamente - ed è abbastanza generale che posso vedere come posso usarla altrove nel mio lavoro con Matlab – trican

Problemi correlati