用循环制作对角矩阵

时间:2018-03-23 07:50:55

标签: loops matrix stata

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
    }
}

2 个答案:

答案 0 :(得分:1)

@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 |
     +------------------------+

答案 1 :(得分:0)

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

你的第二个代码块中的内循环有几个错误,但我不会拼出它们。你疯狂地猜测,而不是编写代码的方式!

您可以直接在Stata中获得对角矩阵,如下所示:

. mat whatever = 7 * I(5)

. mat li 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

forval j = 1/5 {
    gen 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 |
     +------------------------+