精华内容
下载资源
问答
  • 向量单位化是指,将...下面对各种列向量单位化MATLAB代码进行比较。MATLAB版本为R2019a,CPU为Intel i7 8700.一、两层for循环先试试最笨的两层for循环。逻辑很接近C的语言逻辑,很容易理解。function test A ...

    向量的单位化是指,将向量的每个元素除以向量的模(2-范数),使得向量的模(2-范数)变为1.

    在机器学习、压缩感知、稀疏表现等方面,经常需要对矩阵的每个列向量进行单位化。下面对各种列向量单位化的MATLAB代码进行比较。MATLAB版本为R2019a,CPU为Intel i7 8700.

    一、两层for循环

    先试试最笨的两层for循环。逻辑很接近C的语言逻辑,很容易理解。

    function test
    A  = randn(1e4,1e4);
    f1 = @() fun1(A);
    fprintf("矩阵列向量单位化两层for循环耗时%.4f秒n",timeit(f1));
    end
    
    %% 两层for循环
    function A = fun1(A)
    for ii = 1:size(A,2)
        tmp = 0;
        for jj = 1:size(A,1)
            tmp = tmp + A(jj,ii)^2;
        end
        tmp = sqrt(tmp);
        for jj = 1:size(A,1)
            A(jj,ii) = A(jj,ii)/tmp;
        end
    end
    end

    10000×10000的矩阵列向量单位化,两层for循环仅耗时0.5877秒。比我想象的快的多,MATLAB for循环速度慢在新版MATLAB面前就是个笑话。

    二、for循环+sum函数

    function test
    A  = randn(1e4,1e4);
    f2 = @() fun2(A);
    fprintf("矩阵列向量单位化for循环+sum函数耗时%.4f秒n",timeit(f2));
    end
    
    %% 单层for循环 + sum函数
    function A = fun2(A)
    for ii = 1:size(A,2)
        A(:,ii) = A(:,ii)/sqrt(sum(A(:,ii).^2));
    end
    end

    单层for循环+sum函数,居然耗时0.6027秒,比两层for循环还慢,令人震惊!看来MATLAB对for循环的优化已经到了令人发指的地步。

    三、for循环+norm函数

    norm函数是built-in函数,用于求矩阵、向量的范数,默认是2-范数。注意,矩阵范数与矩阵列向量的范数不是一个概念。

    function test
    A  = randn(1e4,1e4);
    f3 = @() fun3(A);
    fprintf("矩阵列向量单位化for循环+norm函数耗时%.4f秒n",timeit(f3));
    end
    
    %% 单层for循环 + norm函数
    function A = fun3(A)
    for ii = 1:size(A,2)
        A(:,ii) = A(:,ii)/norm(A(:,ii));
    end
    end

    单层for循环+sum函数,耗时0.5496秒,优于两层for循环。

    四、向量化(右乘对角矩阵)

    采用右乘一个对角矩阵的方式对矩阵进行缩放,常见的列向量单位化操作。

    function test
    A  = randn(1e4,1e4);
    f4 = @() fun4(A);
    fprintf("矩阵列向量单位化:右乘对角矩阵法耗时%.4f秒n",timeit(f4));
    end
    
    %% 右乘对角矩阵实现对原矩阵的缩放
    function A = fun4(A)
    A = A*diag(1./sqrt(sum(A.^2,1)));
    end

    耗时7.9222秒!!!彻底翻车,大量的时间花费在分配内存生成10000×10000的对角矩阵上,效率低的令人发指!

    五、bsxfun + sum函数

    虽然Compatible Array Sizes功能已经取代了bsxfun函数,但我仍然喜欢写成bsxfun的形式。

    function test
    A  = randn(1e4,1e4);
    f5 = @() fun5(A);
    fprintf("矩阵列向量单位化:bsxfun + sum耗时%.4f秒n",timeit(f5));
    end
    
    %% bsxfun + sum
    function A = fun5(A)
    A = bsxfun(@rdivide,A,sqrt(sum(A.^2)));
    end

    耗时0.3529秒。bsxfun一如既往的给力。

    六、bsxfun + arrayfun(for)

    arrayfun本质上还是for循环,只不过形式更加简洁。

    function test
    A  = randn(1e4,1e4);
    f6 = @() fun6(A);
    fprintf("矩阵列向量单位化:bsxfun + arrayfun耗时%.4f秒n",timeit(f6));
    end
    
    %% bsxfun + arrayfun + norm
    function A = fun6(A)
    f = @(ii) norm(A(:,ii));
    A = bsxfun(@rdivide,A,arrayfun(f,1:size(A,2)));
    end

    耗时0.2949秒!效果非常好。

    七、bsxfun + vecnorm

    MATLAB 有自带的对矩阵列向量求范数的built-in函数,vecnorm,试一下运行效率如何。(这个函数我也是写文章时才发现的)

    function test
    A  = randn(1e4,1e4);
    f7 = @() fun7(A);
    fprintf("矩阵列向量单位化:bsxfun + vecnorm耗时%.4f秒n",timeit(f7));
    end
    
    %% bsxfun + vecnorm
    function A = fun6(A)
    A = bsxfun(@rdivide,A,vecnorm(A));
    end

    耗时仅0.1565秒! Amazing

    七、不同大小的矩阵测试

    function runTime = main
    % 测试矩阵的大小
    nRows = [10,50,100,500,1e3,5e3,1e4,5e4,1e5];
    nColu = [10,50,100,500,1e3,5e3];
    
    runTime = inf(numel(nRows),numel(nColumn),6);
    for ii = 1:numel(nRows)
        for jj = 1:numel(nColu)
            A = randn(nRows(ii),nColu(jj));
            for kk = 1:6
                f{kk} = eval([' @() fun', num2str(kk), '(A);']);
                runTime(ii,jj,kk) = timeit(f{kk});
            end
            [mTime,idx] = min(runTime(ii,jj,:));
            fprintf('%d×%d矩阵列向量单位化最快的是 fun%d:%.4f秒n',nRows(ii),nColu(jj),idx,mTime);
        end
    end

    测试表明,当矩阵

    维度,M,N<100时,上述6种方法的耗时差别不大,相比之下,双层for循环(fun1)与向量化-右乘对角矩阵(fun4)的速度稍快一些。M>100时,bsxfun+vecnorm函数(fun7)速度最快。

    结论:对于小规模矩阵,向量化(fun4)速度最快,理解起来也很方便;中等或大规模矩阵,bsxfun+vecnorm函数(fun7)速度最快.

    易夕:MATLAB Tricks 专栏目录zhuanlan.zhihu.com
    展开全文
  • matlab-线性代数 向量单位化

    千次阅读 2019-02-21 23:03:00
    matlab : R2018a 64bit      OS : Windows 10 x64 typesetting : Markdown    blog : my.oschina.net/zhichengjiu    gitee : gitee.com/zhichengjiu   code clear clc a=[1 1 0]; b=norm...

         matlab : R2018a 64bit
          OS : Windows 10 x64
    typesetting : Markdown
           blog : my.oschina.net/zhichengjiu
          gitee : gitee.com/zhichengjiu

    code

    clear
    clc
    
    a=[1 1 0];
     
    b=norm(a);  % 模
     
    c=a/b
    
    

    result

    
    c =
    
        0.7071    0.7071         0
    
    >> 
    

    resource

    • [文档] ww2.mathworks.cn/help/matlab
    • [文档] ww2.mathworks.cn/help/simulink
    • [平台] www.oschina.net
    • [平台] gitee.com


    感谢帮助 志成就 的人们。
    matlab优秀,值得学习。基础知识 + 专业知识 + matlab = ?
    Simulink,用于仿真和基于模型的设计,值得学习。
    该博文仅可用于测试与参考。

    转载于:https://my.oschina.net/zhichengjiu/blog/3013319

    展开全文
  • Matlab标准化(单位化)一个向量

    万次阅读 2018-08-09 16:48:08
    输入:(例) p = [0.1501, 0, 1e-05] v = p/norm(p) 输出: v =1.0000 0 0.0001  

    输入:(例)

    p = [0.1501, 0, 1e-05]

    v = p/norm(p)

    输出:

    v =1.0000         0    0.0001

     

    展开全文
  • 002. 002. Matlab 编程思想向量化编程 C 语言的基本元素是单数值比如单变量或数组里...Matlab 程序必须抛弃 C 语言那种单数值元素考虑问题的思路 转以向量矩阵为最小单位来考虑问题 也就是说 Matlab 的编程思 想是向
  • 1.数据矩阵单位化方法一:[plain] view plain copy %%矩阵的列向量单位化%输出矩阵Y为单位化矩阵%方法即是矩阵中所有元素除以该元素所在列向量的二范数clc;clear;X=...

    1.数据矩阵单位化

    方法一:
    1. %%矩阵的列向量单位化  
    2. %输出矩阵Y为单位化矩阵  
    3. %方法即是矩阵中所有元素除以该元素所在列向量的二范数  
    4. clc;  
    5. clear;  
    6. X=[790 3977 849 1294 1927 1105 204 1329  
    7.     768 5037 1135 1330 1925 1459 275 1487  
    8.     942 2793 820 814 1617 942 155 976  
    9.     916 2798 901 932 1599 910 182 1135  
    10.     1006 2864 1052 1005 1618 839 196 1081];  
    11. %方法一  
    12. [m,n]=size(X);  
    13. for i=1:n  
    14.     A(1,i)=norm(X(:,i));  
    15. end  
    16. A=repmat(A,m,1);  
    17. Y=X./A;  
    输出结果:
    Y =
        0.3974    0.4932    0.3959    0.5290    0.4941    0.4601    0.4422    0.4890
        0.3863    0.6247    0.5292    0.5437    0.4936    0.6074    0.5961    0.5471
        0.4738    0.3464    0.3823    0.3327    0.4146    0.3922    0.3360    0.3591
        0.4608    0.3470    0.4201    0.3810    0.4100    0.3789    0.3945    0.4176
        0.5060    0.3552    0.4905    0.4108    0.4149    0.3493    0.4249    0.3977
     
    方法二:
    1. %%矩阵的列向量单位化  
    2. %输出矩阵Y为单位化矩阵  
    3. %方法即是矩阵中所有元素除以该元素所在列向量的二范数  
    4. clc;  
    5. clear;  
    6. X=[790 3977 849 1294 1927 1105 204 1329  
    7.     768 5037 1135 1330 1925 1459 275 1487  
    8.     942 2793 820 814 1617 942 155 976  
    9.     916 2798 901 932 1599 910 182 1135  
    10.     1006 2864 1052 1005 1618 839 196 1081];  
    11. %方法二  
    12. [m,n]=size(X);  
    13. a=0;  
    14. for j=1:n  
    15.     for i=1:m  
    16.         a=a+X(i,j)^2;  
    17.     end  
    18.     A(1,j)=sqrt(a);  
    19.     a=0;  
    20. end  
    21. A=repmat(A,m,1);  
    22. Y=X./A  
    输出结果:
    Y =
        0.3974    0.4932    0.3959    0.5290    0.4941    0.4601    0.4422    0.4890
        0.3863    0.6247    0.5292    0.5437    0.4936    0.6074    0.5961    0.5471
        0.4738    0.3464    0.3823    0.3327    0.4146    0.3922    0.3360    0.3591
        0.4608    0.3470    0.4201    0.3810    0.4100    0.3789    0.3945    0.4176
        0.5060    0.3552    0.4905    0.4108    0.4149    0.3493    0.4249    0.3977
    结果同上。
     

    2.数据矩阵归一化

    归一化,将不同样本的同一维度的数据归一化。
    函数:mapminmax
    默认规范范围(-1,1)
    若想将规范范围划为(0,1),可编写Y=mapminmax(A,0,1);
    此函数规整行向量中最大最小值,如果运用此函数,则A矩阵每一行为一个维度,每一列是一个样本。
    1. %%矩阵数据归一化  
    2. %归一化作用是处理奇异样本矩阵  
    3. %将矩阵数据规范与一个范围之中,使不同维度具有可比性  
    4. clc;  
    5. clear;  
    6. X=[790 3977 849 1294 1927 1105 204 1329  
    7.     768 5037 1135 1330 1925 1459 275 1487  
    8.     942 2793 820 814 1617 942 155 976  
    9.     916 2798 901 932 1599 910 182 1135  
    10.     1006 2864 1052 1005 1618 839 196 1081];  
    11. Y=mapminmax(X,0,1);  
    输出结果:
    Y =
        0.1553    1.0000    0.1710    0.2889    0.4567    0.2388         0    0.2982
        0.1035    1.0000    0.1806    0.2215    0.3465    0.2486         0    0.2545
        0.2983    1.0000    0.2521    0.2498    0.5542    0.2983         0    0.3112
        0.2806    1.0000    0.2748    0.2867    0.5417    0.2783         0    0.3643
        0.3036    1.0000    0.3208    0.3032    0.5330    0.2410         0    0.3317
    规范范围为(-1,1)
    1. %%矩阵数据归一化  
    2. %归一化作用是处理奇异样本矩阵  
    3. %将矩阵数据规范与一个范围之中,使不同维度具有可比性  
    4. clc;  
    5. clear;  
    6. X=[790 3977 849 1294 1927 1105 204 1329  
    7.     768 5037 1135 1330 1925 1459 275 1487  
    8.     942 2793 820 814 1617 942 155 976  
    9.     916 2798 901 932 1599 910 182 1135  
    10.     1006 2864 1052 1005 1618 839 196 1081];  
    11. Y=mapminmax(X);  

     
    输出结果:
    Y =
       -0.6894    1.0000   -0.6581   -0.4222   -0.0867   -0.5224   -1.0000   -0.4037
       -0.7929    1.0000   -0.6388   -0.5569   -0.3070   -0.5027   -1.0000   -0.4910
       -0.4033    1.0000   -0.4958   -0.5004    0.1084   -0.4033   -1.0000   -0.3776
       -0.4388    1.0000   -0.4503   -0.4266    0.0833   -0.4434   -1.0000   -0.2714
       -0.3928    1.0000   -0.3583   -0.3936    0.0660   -0.5180   -1.0000   -0.3366
     

    3.数据矩阵标准化

    标准化的数据均值为0,标准差为1
    标准化函数zscore(x)
    就是原数据减去均值,再除以标准差(无偏估计)
    即Z=(x-mean(x))./std(x);
    1. %%矩阵数据标准化  
    2. clc;  
    3. clear;  
    4. X=[790 3977 849 1294 1927 1105 204 1329  
    5.     768 5037 1135 1330 1925 1459 275 1487  
    6.     942 2793 820 814 1617 942 155 976  
    7.     916 2798 901 932 1599 910 182 1135  
    8.     1006 2864 1052 1005 1618 839 196 1081];  
    9. Y=zscore(X);  
    输出结果:
    Y =
       -0.9261    0.4840   -0.7522    0.9640    1.1002    0.2177    0.0358    0.6225
       -1.1419    1.5457    1.3487    1.1224    1.0886    1.6449    1.6257    1.3944
        0.5651   -0.7020   -0.9653   -1.1488   -0.6967   -0.4395   -1.0614   -1.1023
        0.3100   -0.6969   -0.3702   -0.6294   -0.8011   -0.5685   -0.4568   -0.3254
        1.1929   -0.6308    0.7390   -0.3081   -0.6909   -0.8547   -0.1433   -0.5892
     
    也可以按照上面的公式:
    1. %%矩阵数据标准化  
    2. clc;  
    3. clear;  
    4. X=[790 3977 849 1294 1927 1105 204 1329  
    5.     768 5037 1135 1330 1925 1459 275 1487  
    6.     942 2793 820 814 1617 942 155 976  
    7.     916 2798 901 932 1599 910 182 1135  
    8.     1006 2864 1052 1005 1618 839 196 1081];  
    9.   
    10. Y=(X-repmat(mean(X),5,1))./repmat(std(X),5,1);  
    输出结果:
    Y =
       -0.9261    0.4840   -0.7522    0.9640    1.1002    0.2177    0.0358    0.6225
       -1.1419    1.5457    1.3487    1.1224    1.0886    1.6449    1.6257    1.3944
        0.5651   -0.7020   -0.9653   -1.1488   -0.6967   -0.4395   -1.0614   -1.1023
        0.3100   -0.6969   -0.3702   -0.6294   -0.8011   -0.5685   -0.4568   -0.3254
        1.1929   -0.6308    0.7390   -0.3081   -0.6909   -0.8547   -0.1433   -0.5892
    和以上结果一致。
     
     
    展开全文
  • 下面展示一种在三维点云上可视向量的方法,将单位向量映射到RGB立方体上相应的RGB颜色。用于将三维点云或网格数据上的法向矢量可视化为彩色,而不是法向量箭头因为有时很难看清楚箭头的指向。 对于点云中的一个...
  • 问题是这样,如果我们知道两个向量v1和v2,计算从v1转到v2的旋转...四元数q可以表示为 cos(所以我们求出u和θ/2即可,u等于v1与v2的叉积,不要忘了单位化;θ/2用向量夹角公式就能求。clear all;close all;clc;v1=[1...
  • 正交向量组若有一个向量组 它们两两正交,则称这个向量组为正交向量组。例子:(1,0,0) (0,1,0) (0,0,1) 构成一个正交向量组。...正交矩阵若一个正交基内的每一个向量均为单位向量(模为1的向量),则称其为...
  • MATLAB矩阵归一

    千次阅读 2020-11-04 10:56:34
    一、单位化矩阵 输出矩阵Y为单位化矩阵; 方法即是矩阵中所有元素除以该元素所在列向量的二范数 clc; clear; X=[790 3977 849 1294 1927 1105 204 1329 768 5037 1135 1330 1925 1459 275 1487 942 2793 820 814...
  • Matlab中不用eig()命令求方阵的特征值和特征向量矩阵,并判断其是否可以对角 #本文仅针对标题所示问题的代码解答,若相关概念不熟,请去资料。 #不要问我为什么放着好好的eig()命令不用,反而去写一堆代码。这得...
  • 与施密特算法不同,matlab不采用施密特算法对向量组做规范正交。施密特算法对误差积累比较敏感。 A*B 等于单位矩阵,说明过度矩阵相乘 互为逆矩阵。 线性方程组 齐次线性方程组 齐次线性方程组一定有零解。...
  • MATLAB自问世以来,就是以数值计算称雄 MATLAB进行数值计算的基本单位是复数数组或称阵列这使得MATLAB高度向量化 它不需定义数组的维数并给出矩阵函数特殊矩阵专门的库函数使之在求解诸如信号处理建模系统识别控制...
  • 共32分 1MATLAB是由英语Matrix矩阵和Laboratory实 验室两个单词的前三个字母的组合而成的 2MATLAB是以 向量 矩阵 为基本的数据单元可以编写结构有面向对象特点的程序 3MATLAB是以 矩阵 作为数据操作的基本单位语言...
  • MATLAB自问世以来,就是以数值计算称雄 MATLAB进行数值计算的基本单位是复数数组或称阵列这使得MATLAB高度向量化 它不需定义数组的维数并给出矩阵函数特殊矩阵专门的库函数使之在求解诸如信号处理建模系统识别控制...
  • eye 单位阵 ezcontour 画等位线的简捷指令 ezcontourf 画填色等位线的简捷指令 ezgraph3 画表面图的通用简捷指令 ezmesh 画网线图的简捷指令 ezmeshc 画带等位线的网线图的简捷指令 ezplot 画二维曲线的简捷...
  • 现在计划类问题是常见数学建模问题离散系统优化问题通常全部能够经过计划模型来求解用MATLAB求解计划问题能够避免手工烦琐计算大大提升工作效率和结果正确性MATLAB是一个应用于数学计算及计算结果可视处理面向对象...
  • 相机标定 matlab

    2018-05-24 21:58:54
    matlab 相机标定代码 摄像机标定(Camera calibration)简单来说是从世界坐标系换到图像坐标系的过程,也就是求最终的投影矩阵的过程。 [1]基本的坐标系: 世界坐标系; 相机坐标系; 成像平面坐标系; 像素坐标系 ...
  • 及(,)0,1,2,..., 1.T i k i k Cov Y Y l l k i =∑==-下,求 l i 使 Var(Y i )达到... 1.2 总体主成分的计算设 ∑是12(,,...,)T p X X X X =的协方差矩阵,∑的特征值及相应的正交单位化特征向量分别为120p λλλ≥...
  • MATLAB 学习笔记 10

    2019-11-02 15:46:48
    对数间隔向量 书写格式 logspace(d1,d2,n) 显示格式的设置 矩阵的乘法 点乘是各位置上的数字相乘,不加点是向量乘法 矩阵的除法 方阵的行列式 格式:det() 矩阵的转置 单位矩阵 eye() 全1矩阵 ones()...
  • MATLAB画图详细教程

    2020-12-10 21:14:57
    本文将详细介绍如何用matlab绘图并美化。 关于figure() 创建图窗窗口:figure() figure()的属性: ...'unit':单位,可以选择'normalized',使得位置参数为屏幕的归一位置,屏幕归一坐标(x,y),(0,0)表示左
  • MATLAB自产生之日起就具有方便的数据可视功能,以将向量和矩阵用图形表现出来,并且可以对图形进行标注和打印。高层次的作图包括二维和三维的可视、图象处理、动画和表达式作图。可用于科学计算和工程绘图。新...
  • MATLAB(五)在线性代数中的应用

    千次阅读 2018-07-29 13:53:49
    求列向量组A的一个最大线性无关组,可用命令rref(A)将A成行最简形,其中单位向量对应的列向量即为最大线性无关组所含向量,其他列向量的坐标即为其对应向量用最大线性无关组线性表示的系数。 例1. 求下列矩阵列...
  • 普通高等院校计算机课程规划教材;... 定理5.1表明求X的主成分等价于求它的协方差矩阵的所有特征值及相应的正交单位化特征向量;我们称 为第个主成分的贡献率他表示第个主成分提取的信息占总信息的百分比;在MATLA

空空如也

空空如也

1 2 3
收藏数 53
精华内容 21
关键字:

matlab单位化向量

matlab 订阅