2016-04-11 13 views
0

を倍増私は、このエラーが何を意味するかまたはそれを修正する方法がわかりません。別の座標空間でイメージの回転を実行しようとしています。行列の参照空間をゼロにすると、整数は同じクラスまたはスカラ倍の整数でしか扱うことができないというエラーが発生します。行は整数は、同じクラスまたはスカラーの整数と組み合わせることができ、エラー

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

です。作業領域では、WZは400x299x3ユニット8に分類されます。それはイメージです。関数が呼び出されると、x0とy0は0に設定されます。この問題を解決するにはどうすればよいですか/ここでは何が起こっていますか?私は同じことを行うときにも

、まだ私はというエラーを取得WZが倍に等しくなるように(WZ)を作る「行列の次元が同意する必要があります。」私は二重機能が何をしているのかは分かりません。ここにコード全体があります。

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; 

答えて

1

これは、異なるデータ型のWZ([x0;y0] * ones(1,Ncols))ことに起こります。整数型で動作する浮動小数点型を使用するときは、MATLABの型が緩いと思うかもしれませんが、この規則はしばらく毎に破棄されます。これを実証するためのより簡単な例は次のとおりです。

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

これは報告しているのと同じエラーで壊れます。これを修正する1つの方法は、オペランドの1つを強制的に他のオペランドにキャストし、通常はキャストして数学の動作を確認することです。これを行うと、作業している数値は両方とも浮動小数点(倍精度)なので、メモリ内の同じバイトフォーマットシーケンスで表されます。この方法では、「 - 」記号は、あなたが3個のリンゴ+ 4個のりんご= 7個のりんごが、3つのオレンジ(UINT8)(ダブル)+ 4個の=リンゴを言うことができるのと同じ方法で、有効なのですか?を。 double(X)は、倍精度の算術演算を使用することを実際に意味しているため、エラーを修正します。これは今見ているとおりです:

double(X) - Y 

これを特定した後、新しいエラーは「行列の次元が一致しません」です。これは、それが言うことを正確に意味します。 WZは400x299x3の行列で、右側の行列は2xnColsです。今では、異なるサイズの3D行列から意味のある2D行列を減算できますか?

あなたのコードが本当にしようとされているものに応じて、サイズが等しくするために他の方法をパッドRHS行列を、あるいは見つけることができます。 MATLABは、画像の回転、すなわちhttp://www.mathworks.com/help/images/ref/imrotate.htmlを行うためのルーチンを含んでいる理由

このすべてがあります。しかしこれはImage Processing Toolboxの一部です。

関連する問題