2016-04-11 5 views
0

kombiniert werden Ich weiß nicht, was dieser Fehler bedeutet oder wie es zu beheben ist. Ich versuche eine Bilddrehung in einem separaten Koordinatenraum durchzuführen. Wenn ich den Referenzraum der Matrix auf Null setze, bekomme ich den Fehler, dass ganze Zahlen nur mit ganzen Zahlen der gleichen Klasse oder skalaren Doppelzahlen kombiniert werden können. Die Linie istGanzzahlen können nur mit Ganzzahlen der gleichen Klasse oder skalare Doppelfehler

WZcentered = WZ - [x0;yo]*ones(1,Ncols); 

WZ ist als eine 400x299x3 Einheit 8, im Arbeitsbereich eingestuft. Es ist ein Bild. x0 und y0 werden beim Aufruf der Funktion auf 0 gesetzt. Wie kann ich dieses Problem beheben/was genau passiert hier?

Auch wenn ich das gleiche mache noch machen WZ gleich doppelt (WZ) bekomme ich den Fehler, dass 'Matrix-Dimensionen übereinstimmen müssen.' Ich bin mir nicht sicher, was die Doppelfunktion aber tut. Hier ist der ganze Code.

function [out_flag, WZout, x_final, y_final] = adopted_moveWZ(WZ, x0, y0); 

%Initial Test of plot 
[Nrows,Ncols]=size(WZ); 
if Nrows ~= 2 
    if Ncols ==2 
     WZ=transpose(WZ); %take transpose 
     [Nrows,Ncols]=size(WZ); %reset the number of rows and columns 
    else 
     fprintf('ERROR: Input file should have 2-vectors for the input points.\n'); 
    end 
end 

plot(WZ(1,:),WZ(2,:),'.') 
title('These are the original points in the image'); 
pause(2.0) 
%WZorig = WZ; 

%centering 
WZcentered = WZ - ([x0;y0] * ones(1,Ncols)); 


FigScale=400; 
axis([-FigScale 2*FigScale -FigScale 2*FigScale]) 
disp('Hit any key to start the animation'); 
pause; 

SceneCenter = zeros(Nrows,Ncols); 
WZnew = WZcentered; 

for ii=0:20 

    %rotate 
    R = [cos(pi/ii) -sin(pi/ii) 0; sin(pi/ii) cos(pi/ii) 0; 0 0 1]; 
    WZnew = R * WZnew; 
    plot(WZnew(1,:),WZnew(2,:),'.') 
    %place WZnew at a different place in the scene 
    SceneCenter = (ii*[30;40])*ones(1,Ncols); 
    plot(SceneCenter(1,:) + WZnew(1,:), SceneCenter(2,:) + WZnew(2,:),'.') 
    axis([-FigScale 2*FigScale -FigScale 2*FigScale]) 
    pause(1.0); 


end 


%Set final values for output at end of program 
x_final = SceneCenter(1,1); 
y_final = SceneCenter(2,1); 
PPout = PPnew + SceneCenter; 

Antwort

1

Dies geschieht aufgrund WZ und ([x0;y0] * ones(1,Ncols)) von unterschiedlichen Datentypen. Sie denken vielleicht, MATLAB sei locker typisiert und sollte daher das Richtige tun, wenn Sie einen Gleitkommatyp mit einem Integer-Typ betreiben, aber diese Regel bricht immer wieder ab. Ein einfacheres Beispiel, um dies zu demonstrieren, ist hier:

X = uint8(magic(5)) 
Y = zeros(5) 
X - Y 

Dies bricht mit dem gleichen Fehler, den Sie melden. Eine Möglichkeit, dies zu beheben, besteht darin, einen der Operanden auf den jeweils anderen zu zwingen, um sicherzustellen, dass die Mathematik funktioniert. Wenn Sie dies tun, sind beide Zahlen, an denen Sie arbeiten, Fließkommazahlen (doppelte Genauigkeit) und werden daher in derselben Byteformatierungssequenz im Speicher dargestellt. Auf diese Weise ist das '-' Zeichen gültig, genauso wie man 3 Äpfel + 4 Äpfel = 7 Äpfel, aber 3 Orangen (Uint8) + 4 Äpfel (Doppel) =? Das double (X) macht deutlich, dass Sie wirklich arithmetische Berechnungen mit doppelter Genauigkeit verwenden möchten und beheben Sie so den Fehler. So sieht es jetzt aus:

double(X) - Y 

Nach der Identifizierung ist der neue Fehler 'Matrixabmessungen passen nicht'. Dies bedeutet genau das, was es sagt. WZ ist eine 400x299x3-Matrix und die rechte Matrix ist 2xnCols. Können Sie nun eine 2D-Matrix sinnvoll von einer 3D-Matrix unterschiedlicher Größe subtrahieren?

Je nachdem, was Ihr Code wirklich vorhat, können Sie die RHS-Matrix auffüllen oder andere Möglichkeiten finden, die Größen gleich zu machen.

All dies ist der Grund, warum MATLAB Routinen für die Bildrotation enthält, nämlich http://www.mathworks.com/help/images/ref/imrotate.html. Dies ist jedoch Teil der Image Processing Toolbox.