2016-08-01 22 views
0

行列の最初の列を掛けようとしています。私はこのコードを試してみました:ベクトル行列の乗算

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

をしかし、私は次のエラーを取得:

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

をし、私は自分のコードを変更するとき:もう一度y = A.*x0;私が手:

Error using .* Matrix dimensions must agree.

私が使用している場合whosコマンドでは、これは次のようになります。 Aは256x256の行列、x0は256x1の行列です。私は自分のコードで何が間違っているのか知りません。

答えて

2

imreadが整数値を戻しています。

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

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

A = imread('cameraman.tif'); 

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

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

whosに見て重要なことは、「クラス」列に表示されたデータ型です:あなたは最初の前に乗算を行うにdoubleと浮動小数点数に変換する必要があります

0

行列をdoubleまたはsingleにキャストする必要があります。

Ad = double(A); 

または:

As = single(A); 

これは、画像行列であるので、関数imshowは、シングル/ダブルの値がUINTため[0,255]の範囲内にあることを期待して[0,1]ことに留意されたいです。ですから、表示する前に整数またはスケールにキャストし直してください。

1

前述のとおり、データを倍精度に変換する必要があります。これを行うには、im2doubleファンクションを使用します。この関数はデータも正規化します。

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