【问题标题】:Generating a specific Symmetric Matrix生成特定的对称矩阵
【发布时间】:2018-12-20 00:49:40
【问题描述】:

我想要一种快速的方法(一行,在 python numpy 或 matlab 中)生成一个特定的对称矩阵,知道它的尺寸和参数a

这个矩阵的对角线应该有1-a,其他地方应该有:

1-a a a a ....... a a 1-a a ........... a a a 1-a a a a . . . . . . 1-a a a .......................... 1-a

【问题讨论】:

    标签: matlab numpy matrix symmetric


    【解决方案1】:

    在 MATLAB 中你可以这样做:

    a*ones(n,n) + (1-2*a)*diag(ones(n,1))

    n 是矩阵的大小。

    如果你能忍受两条线,你也可以这样做:

    A = a*ones(n,n);
    A(1:n+1:end) = 1-a; %this sets the diagonal entries
    

    我认为效率更高。

    【讨论】:

      【解决方案2】:

      @Savithru 在 Matlab 中有两个很好的答案。在这里我只是为了好玩....

      编辑:令人惊讶的是,repmat 后跟 reshape 实际上比加法更快。在以下示例中,对包括 Savithru 在内的不同方法进行计时和比较。

      n = 1e4;
      a = 2;
      timeit(@() reshape([repmat([1-a, a*ones(1,n)], 1,n-1),1-a], n,n))
      timeit(@() a*ones(n,n) + (1-2*a)*eye(n))
      timeit(@() a*ones(n,n) + (1-2*a)*diag(ones(n,1)))
      timeit(@() testf(a,n))
      
      function y = testf(a,n)
      A = a*ones(n,n);
      A(1:n+1:end) = 1-a;
      y = A;
      end
      
      
      ans =
      
          0.7034
      
      
      ans =
      
          1.0010
      
      
      ans =
      
          1.0091
      
      
      ans =
      
          0.4209
      

      【讨论】:

        【解决方案3】:

        下面的方法可能不是 1 行,但应该很快!

        方法一:用np.ones创建数组并用fill_diagonal填充

        使用numpy,您可以使用np.onesnp.fill_diagonal

        a = 5
        size = 5
        
        arr = np.ones((size,size)) * a
        np.fill_diagonal(arr, a-1)
        
        >>> arr
        array([[4., 5., 5., 5., 5.],
               [5., 4., 5., 5., 5.],
               [5., 5., 4., 5., 5.],
               [5., 5., 5., 4., 5.],
               [5., 5., 5., 5., 4.]])
        

        方法 2:用np.diag_indices 填充对角线:

        或者,使用np.diag_indices:

        arr = np.ones((size,size)) * a
        di = np.diag_indices(size)
        arr[di] = a-1
        

        方法3:用np.full创建数组

        您也可以使用np.full 而不是np.ones 创建原始数组:

        arr = np.full((size,size), a)
        np.fill_diagonal(arr, a-1)
        # or:
        # arr = np.full((size,size), a)
        # np.fill_diagonal(arr, a-1)
        

        【讨论】:

          【解决方案4】:

          这是一个 numpy one 班轮

          a = 0.7
          n = 4
          
          np.where(np.eye(n), 1-a, a)
          # array([[0.3, 0.7, 0.7, 0.7],
          #        [0.7, 0.3, 0.7, 0.7],
          #        [0.7, 0.7, 0.3, 0.7],
          #        [0.7, 0.7, 0.7, 0.3]])
          

          如果速度是一个问题,那么我推荐

          res = np.full((n, n), a)
          np.einsum('ii->i', res)[:] = 1-a
          res
          # array([[0.3, 0.7, 0.7, 0.7],
          #        [0.7, 0.3, 0.7, 0.7],
          #        [0.7, 0.7, 0.3, 0.7],
          #        [0.7, 0.7, 0.7, 0.3]])
          

          【讨论】:

            猜你喜欢
            • 2012-06-04
            • 2015-01-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-02-09
            相关资源
            最近更新 更多