2016-11-24 8 views
2

をベクトルに変換:MATLAB - 私はベクトルを持つ単位ベクトルに

vector = [1 2 3;4 5 6; 7 9 0] 
vector = 

    1  2  3 
    4  5  6 
    7  9  0 

私はこれを取ると単位ベクトルを作成します。基本的に私はすべての行で、各行における全てのベクトル要素を分割する必要があります

vector./mag 
Error using ./ 
Matrix dimensions must agree. 

:私たちは、私はエラーを取得する大きさで各要素を分割しようとすると

mag = sqrt(sum(vector'.^2))' 

mag = 

    3.7417 
    8.7750 
    11.4018 

を:私たちは、実行して大きさを得ることができますマグベクトル内にある。これどうやってするの?

答えて

9

他の答えでも正しい結果が得られますが、計算を高速化するために計算をベクトル化できます。

ret = bsxfun(@rdivide, vector, mag) 

私はそれが行列計算のための非常に便利な機能です、bsxfunを使用することをお勧めします。

+2

Octaveでbsxfunとrepmatのクイックタイミングを実行しました: '>> tic; 0(10000,10000)+ repmat((1:10000) '、1,10000); toc 経過時間は1です。18秒。 '>> tic; bsxfun(@plus、0(10000,10000)、(1:10000) '); toc 経過時間は0.726秒です。「 – stephematician

+4

@stephematician 'bsxfun'はいつもより速いです。この関連記事を参照してください:http://stackoverflow.com/questions/12951453/in-matlab-when-is-it-optimal-to-use-bsxfun – rayryeng

2

簡単な解決策は、forループを使用することである:

vector = [1 2 3; 4 5 6; 7 9 0]; 
mag = sqrt(sum(vector'.^2))'; 
A = []; 
for i = 1:numel(mag) 
    A(i,:) = vector(i,:)./mag(i); 
end 
+0

ループのためのAはほとんどneveですベクトル演算を考慮する場合はMatlabの最良のオプションです。 – Bernhard

+1

ここでの問題はforループ(bsxfunに匹敵する結果を与えるかもしれない)ではなく、 'A'の事前割り当てです。事前割り当てをしないと、それは確実に遅くなるでしょう。 –

3

問題は、エラーメッセージが言うように、vectormagの寸法が一致していない、ということです。 vectorの最初の行のすべての要素をmag(1)で除算したいとします。 必要なのはrepmat()で、これは「配列のコピーを繰り返す」です。

3.7417 3.7417 3.7417 
    8.7750 8.7750 8.7750 
    11.4018 11.4018 11.4018 

ですから、ワンライナーを使用することができます:

vector./repmat(mag,1,3) 
ans = 

    0.26726 0.53452 0.80178 
    0.45584 0.56980 0.68376 
    0.61394 0.78935 0.00000 

そのように、すべての列がmagの正確なコピーであるような3x3行列を返す

repmat(mag,1,3) 
を書く vectorの最初の行、すなわち [1 2 3]は、要素ごとに [3.7417 3.7417 3.7417]で分割されています。 つまり、 vectorのすべての要素が正しい大きさで除算されます。

2

あなたは、MATLABで行列演算子を使用することができます。magの寸法が大きすぎることができれば、あなたはそれのまばらなバージョンを使用することができます

result = diag(1./mag)*vector; 

result = spdiags(1./mag,0,speye(numel(mag)))*vector; 
1
vector = [1 2 3; 4 5 6 ;7 9 0] ; 

[n,m]=size(vector); 

for i=1:n 
normv=norm(vector(i,:),2); 
nvector(i,:)=vector(i,:)/normv; 
end 

nvectorをます各行の正規化されたベクトルを含む

+0

マグニチュードを見つけるための 'norm'への明示的な呼び出し以外に、これは答えはここまで見た他のものとまったく同じではありません。 – rayryeng

関連する問題