【发布时间】:2019-05-10 00:06:15
【问题描述】:
看看this link。
我正在尝试理解以下用于查找矩阵的平稳分布的源代码:
# Stationary distribution of discrete-time Markov chain
# (uses eigenvectors)
stationary <- function(mat)
{
x = eigen(t(mat))$vectors[,1]
as.double(x/sum(x))
}
我自己测试了以下源代码:
> rm(list=ls())
>
> P <- matrix(c(0.66, 0.34,
+ 0.66, 0.34), nrow=2, ncol=2, byrow = TRUE)
>
> x <- eigen(t(P))
> x$values
[1] 1 0
$vectors
[,1] [,2]
[1,] 0.8889746 -0.7071068
[2,] 0.4579566 0.7071068
> y <- x$vectors[,1]
> y
[1] 0.8889746 0.4579566
>
看起来像命令
y <- x$vectors[,1]
正在选择矩阵的第一列。
为什么不简单地写成下面这样?
# Stationary distribution of discrete-time Markov chain
# (uses eigenvectors)
stationary <- function(mat)
{
x = eigen(t(mat))
y = x[,1]
as.double(y/sum(y))
}
引入美元符号和向量关键字的原因是什么?
【问题讨论】:
-
美元运算符继承自 S/Splus。最好避免它。 (你的观察是正确的,IMO)
-
“引入美元符号和矢量关键字的原因是什么?” 我很困惑你在问什么。
eigen返回一个list,其中元素vectors是存储在矩阵中的特征向量。因此,您只需从eigen返回的list访问vectors元素。使用$索引访问list元素没有任何问题,例如lst <- list(a=1, b=2); lst$a. -
@user366312 我认为 wildplasser 可能误解了您的问题。正如我所说,使用
$访问来自命名list的元素绝对没有任何问题。你也会使用$-indexing 来访问来自data.frame的元素(列),不是吗? -
嗯。也许我误解了这个问题。使用
$表示法访问命名list元素是R 中的绝对标准做法。有关涉及eigen的具体示例,请参见例如Eigenvalues and eigenvectors from the official "An Introduction to R" on CRAN;$索引当然不在 R 中应该避免。 -
我认为您提出的更简单的代码不会产生正确的输出。如前所述,
eigen返回一个包含两个对象的列表。你必须告诉 R 你想要列表中的哪个项目(这里是vectors)然后告诉 R 你想要矩阵的哪一部分。x[[2]][,1]将等同于x$vectors[,1]。这两种都很常见。
标签: r markov-chains markov