2016-08-01 15 views
0

Ich versuche, eine Matrix mit ihrer ersten Spalte zu multiplizieren. Ich habe diesen Code versucht:Multiplikation der Vektormatrix

A = imread('cameraman.tif'); 
x0 = A(:,1); 
y = A*x0; 

Aber ich erhalte den folgenden Fehler:

Error using * MTIMES is not fully supported for integer classes. At least one input must be scalar. To compute elementwise TIMES, use TIMES (.*) instead.

und wenn ich den Code ändern zu: y = A.*x0; wieder erhalte ich:

Error using .* Matrix dimensions must agree.

Wenn ich whos Befehl, bekomme ich das: A ist eine 256x256 Matrix und x0 ist eine 256x1 Matrix. Ich weiß nicht, was mit meinem Code falsch ist.

Antwort

2

imread gibt ganzzahlige Werte zurück. Sie müssen sie zuerst Gleitkommazahlen mit double konvertieren, bevor die Multiplikation auszuführen:

A = imread('cameraman.tif'); 

% Explicitly convert from integer datatype to double 
A = double(A); 

% NOW perform your multiplication 
y = A * A(:,1); 

Die wichtige Sache zu betrachten mit whos ist der Datentyp, die in der Spalte „Class“ aufgeführt wird:

A = imread('cameraman.tif');t 
whos('A') 

%  Name   Size    Bytes Class  Attributes 
%  
%  A   256x256    65536 uint8 
0

Sie müssen die Matrix zu double oder single umwandeln.

Ad = double(A); 

oder:

As = single(A); 

Da es sich um eine Bildmatrix beachten, dass imshow Werte im Bereich von [0,255] für uint und [0,1] für Einzel-/Doppel werden erwartet. Also entweder zurück auf ganze Zahlen oder skalieren vor der Anzeige.

1

Wie bereits erwähnt, müssen Sie die Daten in doppelte Genauigkeit konvertieren. Dazu können Sie die Funktion im2double verwenden. Diese Funktion normalisiert auch die Daten.

a = uint8(randi([0,100],3,3)) 
b=im2double(a) 
b*255 
b(1,:)*b