MATLAB - 转换矢量单元矢量
我有一个向量: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矢量中。我怎样才能做到这一点?
其他答案会给出正确的结果,但您可以将计算进行矢量化以加快计算速度。
ret = bsxfun(@rdivide, vector, mag)
我建议使用bsxfun
,它是矩阵计算一个非常有用的功能。
一个简单的解决方案是使用的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
for循环几乎是neve在考虑矢量运算时,在Matlab中是最好的选择。 – Bernhard
这里的问题不是for循环(正如你所说的那样,它可能会给bsxfun以类似的结果),而是'A'的预分配。如果你不预先分配,肯定会慢一些。 –
的问题是,作为错误消息表示,的vector
mag
和尺寸不匹配。 您想将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
的每个元素除以正确的大小。
可以在MATLAB使用矩阵运算符:
result = diag(1./mag)*vector;
如果mag
尺寸可太大了,你可以使用稀疏的版本是:
result = spdiags(1./mag,0,speye(numel(mag)))*vector;
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会包含每行的归一化向量
除了显式调用'norm'来查找幅度,这答案与迄今为止在这里看到的其他人没有什么不同。 – rayryeng
刚刚做了一个快速的时机在bsxfun与repmat在八度: '>> tic;零(10000,10000)+ repmat((1:10000)',1,10000); toc 已用时间为1。18秒.' '>> tic; bsxfun(@plus,零(10000,10000),(1:10000)'); toc 已用时间为0.726秒。' – stephematician
@stephematician'bsxfun'总是更快。看到这篇相关文章:http://*.com/questions/12951453/in-matlab-when-is-it-optimal-to-use-bsxfun – rayryeng