【问题标题】:Creating a diagonal matrix创建对角矩阵
【发布时间】:2018-03-23 07:50:54
【问题描述】:

这是我目前拥有的代码:

forv i = 1/10 {
    set obs 10
    gen x`i' = (_n-1)*10+`i'
}

我怎样才能把它变成一个对角矩阵,以便当行广告列索引不相等时条目是0

这是我试过但没有用的代码:

forv i=1/10 {
    set obs 10
    gen x`i' = (_n-1)*10+`i'

    foreach j of varlist x1-x10 {
        if _n ~= "`i'"
        replace `j' = 0
    }
}

【问题讨论】:

    标签: loops matrix stata


    【解决方案1】:

    您的第一个代码块是合法的(假设内存中的观察结果不超过10),但不会产生任何接近对角矩阵的东西。命令set obs 10 应该在循环之前执行一次,而不是每次循环。

    在您的第二个代码块中的内部循环中有几个错误,但我不会把它们拼出来。你在胡思乱想,不是写代码的方式!

    你可以像这样在Stata中直接得到一个对角矩阵:

    . matrix whatever = 7 * I(5)
    
    . matrix list whatever
    
    symmetric whatever[5,5]
        c1  c2  c3  c4  c5
    r1   7
    r2   0   7
    r3   0   0   7
    r4   0   0   0   7
    r5   0   0   0   0   7
    

    如果您有理由将其保留为变量,请使用svmat。你可以在一个循环中创建这样一个矩阵作为多个变量的值,但这有点反常:

    clear
    
    set obs 5
    
    forvalues j = 1/5 {
        generate x`j' = 7 * (_n == `j')
    }
    
    list
    
         +------------------------+
         | x1   x2   x3   x4   x5 |
         |------------------------|
      1. |  7    0    0    0    0 |
      2. |  0    7    0    0    0 |
      3. |  0    0    7    0    0 |
      4. |  0    0    0    7    0 |
      5. |  0    0    0    0    7 |
         +------------------------+
    

    【讨论】:

      【解决方案2】:

      @NickCox 的解决方案也适用于mata - Stata 的矩阵编程语言:

      . mata: A = 7 * I(5)
      
      . mata: A
      [symmetric]
             1   2   3   4   5
          +---------------------+
        1 |  7                  |
        2 |  0   7              |
        3 |  0   0   7          |
        4 |  0   0   0   7      |
        5 |  0   0   0   0   7  |
          +---------------------+
      

      然后可以使用getmata 命令将矩阵作为变量获取:

      . getmata (A*) = A
      
      . list A*
      
           +------------------------+
           | A1   A2   A3   A4   A5 |
           |------------------------|
        1. |  7    0    0    0    0 |
        2. |  0    7    0    0    0 |
        3. |  0    0    7    0    0 |
        4. |  0    0    0    7    0 |
        5. |  0    0    0    0    7 |
           +------------------------+
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-15
        • 1970-01-01
        • 2018-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-10
        • 1970-01-01
        相关资源
        最近更新 更多