【问题标题】:Initialize matrix with conditions without a loop使用没有循环的条件初始化矩阵
【发布时间】:2015-11-12 16:29:01
【问题描述】:

我想创建一个矩阵M,索引为i,j,以便M(i,j)=i/j。我可以使用两个循环来做到这一点,但有什么方法可以在不使用 for 循环的情况下做到这一点?

【问题讨论】:

    标签: matlab loops matrix vectorization


    【解决方案1】:

    创建两个索引向量。做一个垂直的,一个水平的。然后使用bsxfun() 进行元素划分。

    i = (1:9)'; % '
    j = 1:5;
    
    M = bsxfun(@rdivide,i,j);
    

    【讨论】:

      【解决方案2】:

      你可以使用向量乘法,像这样:

      row=1:10;
      col=1:10;
      M=row'*(1./col);
      

      【讨论】:

      • 有趣。我针对您的解决方案测试了我的解决方案。某些指数的结果略有不同。由于在乘法中丢失了信息,出现了一个小错误。
      • 有趣。我认为bsxfunndgrid 会比 Matlab 矩阵运算的经典强度要慢。你知道为什么我的解决方案是最慢的..?乘法中丢失了哪些信息?
      • 您的解决方案是最快的。 ndgrid() 最慢。我们解决方案的差异可能是因为1./col 是一个已经在最后一位四舍五入的数值。此舍入误差将成倍增加,因此会出现在解决方案中。
      • @Adiel 我认为matrix-mul 在尺寸减小时会发光。在这种情况下,我们有一个扩展。我最近做了一些基准比较 bsxfun(@timesmatrix-mul 当两者都被输入一个列和一个行向量时,bsxfun 似乎占了上风。因此,似乎这种趋势也随着部门运营而延续。
      • 为了区别。 5/3 == 5*(1/3) 返回 false,这就是为什么最好检查类似 a-b<e-15 的内容。
      【解决方案3】:

      ./ 表示法表示元素明智的操作。

      [m,n]=ndgrid(1:9,1:5);
      M = m./n;
      

      (我不喜欢使用 ij,因为你让引用 sqrt(-1) 变得复杂。)

      【讨论】:

        猜你喜欢
        • 2018-12-15
        • 2017-05-19
        • 1970-01-01
        • 1970-01-01
        • 2019-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多