2013-02-03 17 views
5

substituierte Ich habe zwei Matrizen in Matlab,zwei Matrizen in Matlab, die negativen Werte in Ergebnis subtrahiert werden von Null

> IRwindow = 
> 
> **183** 171 150 125 137 
    138 167 184 173 152 
    105 114 141 167 185 
    148 113 105 115 141 
    186 183 147 112 105 
> 
> ILwindow = 
> 
> **201** 170 165 177 203 
    181 174 167 169 189 
    154 150 156 168 181 
    187 175 158 131 144 
    173 186 183 167 141 

ich diese beiden Matrizen elementweise und erhalten das Ergebnis subtrahieren wollen; zum Beispiel für das erste Element (183 - 201 = -18) ABER der Ausgang für dieses Element ergibt Null. Das Ergebnis lautet wie folgt:

> IRwindow - ILwindow 

ans = 

    **0** 1 0 0 0 
    0 0 17 4 0 
    0 0 0 0 4 
    0 0 0 0 0  
    13 0 0 0 0 

Wie könnte ich die tatsächlichen Ergebnisse halten? ohne in meiner Ergebnis-Matrix

Antwort

6

Führen Sie den folgende Beispielcode Null für Negativ zu bekommen:

%# Create random matrices 
X = randi(100, 5, 5); 
Y = randi(100, 5, 5); 

%# Convert to strictly non-negative format 
X = uint8(X); 
Y = uint8(Y); 

%# Perform subtractions 
A = X - Y; 

%# Convert to double format 
X = double(X); 
Y = double(Y); 

%# Perform subtraction 
B = X - Y; 

Für einen gegebenen Probelauf:

A = 

    0 15 36 0 0 
    0 0 0 0 3 
    0 0 0 25 0 
    13 0 15 0 0 
    0 49 0 0 14 

während:

B = 

    -8 15 36 -4 -65 
    0 -47 -45 -11  3 
    -18 -17 -11 25 -52 
    13 -53 15 -15 -1 
    -35 49 -47 -8 14 

Sie wird bemerken, dass alle negativen Zahlen in A durch 0 ersetzt wurden, während die n egative Zahlen in B werden korrekt angezeigt.

Einfach ausgedrückt: Wenn Sie ein numerisches Format verwenden, das keine negativen Zahlen speichern kann, schneidet Matlab bei 0 ab. Die Lösung besteht darin, in ein Format zu konvertieren, das "echte" Zahlen (oder eine annähernde Annäherung) aufnehmen kann B. double oder vielleicht in Ihrem Fall eines der Formate int kann geeigneter sein, wie int8, int16, int32 oder int64.

0

ich nicht das gleiche Problem wie Sie: Ich habe diesen Code haben:

IRwindow = [ 

183 171 150 125 137 
138 167 184 173 152 
105 114 141 167 185 
148 113 105 115 141 
186 183 147 112 105] 

ILwindow = [ 

201 170 165 177 203 
181 174 167 169 189 
154 150 156 168 181 
187 175 158 131 144 
173 186 183 167 141] 


IRwindow - ILwindow 

und ich bekomme diese Ausgabe:

IRwindow = 

    183 171 150 125 137 
    138 167 184 173 152 
    105 114 141 167 185 
    148 113 105 115 141 
    186 183 147 112 105 


ILwindow = 

    201 170 165 177 203 
    181 174 167 169 189 
    154 150 156 168 181 
    187 175 158 131 144 
    173 186 183 167 141 


ans = 

    -18  1 -15 -52 -66 
    -43 -7 17  4 -37 
    -49 -36 -15 -1  4 
    -39 -62 -53 -16 -3 
    13 -3 -36 -55 -36 

Überprüfen Sie, ob Sie Ihre Matrizen erstellen korrekt erstellt werden (wie verdoppelt und nicht als vorzeichenlose ganze Zahlen).

+0

Ich vermute, das Problem ist, dass die OP ein nicht signiertes Datenformat verwendet und es muss konvertieren zu verdoppeln. Siehe meine Antwort für weitere Details ... –

+0

@ColinTBowers Ja, ich habe auch hinzugefügt, dass er bei der Erstellung nach seinem Typ suchen muss. Ihre Antwort sieht jedoch viel besser aus. –

+0

Ah, ich habe deine Bearbeitung erst nach dem Posten meines Kommentars gesehen. Danke für die Validierung. –

2

Eine weitere Option ist single oder double auf der Subtraktion in einer Zeile wie folgt zu verwenden:

ans=double(IRwindow-ILwindow) 
+0

Ich denke, dies wird einen Fehler werfen, da 'mtimes' nicht in der Lage ist, vorzeichenlose Integer mit logischen Werten zu multiplizieren. Ich bin mir auch nicht sicher, ob dies das Problem löst, da die Ausgabe immer noch Nullen enthält, wo die "negativen" Elemente sein sollten. Oder vielleicht habe ich missverstanden? –

+0

Ja, ich habe die Frage missverstanden ... werde die Antwort bearbeiten – bla

Verwandte Themen