2016-11-24 264 views
2

我有一個向量:MATLAB - 轉換矢量單元矢量

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

    1  2  3 
    4  5  6 
    7  9  0 

我想借此營造一個單位向量。我們可以通過執行獲得大小:

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

mag = 

    3.7417 
    8.7750 
    11.4018 

當我們試圖通過幅度每一個元素劃分我得到一個錯誤:

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

基本上我必須在每一行,將每個行中的每個矢量元素在mag矢量中。我怎樣才能做到這一點?

回答

9

其他答案會給出正確的結果,但您可以將計算進行矢量化以加快計算速度。

ret = bsxfun(@rdivide, vector, mag) 

我建議使用bsxfun,它是矩陣計算一個非常有用的功能。

+2

剛剛做了一個快速的時機在bsxfun與repmat在八度: '>> tic;零(10000,10000)+ repmat((1:10000)',1,10000); toc 已用時間爲1。18秒.' '>> tic; bsxfun(@plus,零(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

for循環幾乎是neve在考慮矢量運算時,在Matlab中是最好的選擇。 – Bernhard

+1

這裏的問題不是for循環(正如你所說的那樣,它可能會給bsxfun以類似的結果),而是'A'的預分配。如果你不預先分配,肯定會慢一些。 –

3

的問題是,作爲錯誤消息表示,的vectormag和尺寸不匹配。 您想將vector的第一行的每個元素除以mag(1)。 你需要的是repmat(),它「重複數組的副本」。 寫作

repmat(mag,1,3) 

返回3x3矩陣,使得每一列的mag的精確副本:

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 

這樣, vector的第一行,即[1 2 3],被逐元素分開[3.7417 3.7417 3.7417]。 換句話說,vector的每個元素除以正確的大小。

2

可以在MATLAB使用矩陣運算符:

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

如果mag尺寸可太大了,你可以使用稀疏的版本是:

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