2016-11-24 190 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