MATLAB - 将矢量转换为单位矢量

时间:2016-11-24 05:27:24

标签: matlab vector

我有一个矢量:

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向量中的每一行。我怎么能这样做?

5 个答案:

答案 0 :(得分:9)

其他答案会给出正确的结果,但您可以对计算进行矢量化以便更快地进行计算。

ret = bsxfun(@rdivide, vector, mag)

我建议使用bsxfun,这是一个非常有用的矩阵计算函数。

答案 1 :(得分: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 :(得分:2)

一个简单的解决方案是使用for循环:

 mCategoriesListview.setOnScrollListener(new OnScrollListener() {

        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {

        }

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
            // TODO Auto-generated method stub

            if (firstVisibleItem + visibleItemCount == totalItemCount && totalItemCount != 0) {

            // add next 10 items in array list and notify adapter change

        }
    });

答案 3 :(得分:2)

您可以在MATLAB中使用矩阵运算符:

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

如果mag的维度太大,您可以使用它的稀疏版本:

result = spdiags(1./mag,0,speye(numel(mag)))*vector;

答案 4 :(得分: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 将包含每行的标准化向量