r 奇怪地将特征向量复制到 for i 循环中的矩阵

r behaves strangely copying eigenvectors to a matrix in a for i loop

我有点困惑。矩阵 A 有 8 个特征值,其中一些是复数,一些是实数。我只想将与实特征值对应的特征向量作为列复制到矩阵 M 中,否则该列应填充 0。我使用代码:

M <- matrix(,ncol=8,nrow=8)
for(i in 1:8) {
 M[,i] <- ifelse(Im(eigen(A)$val[i]) == 0, eigen(A)$vec[,i], 0)
}

但结果就像我执行了这个:

M <- matrix(,ncol=8,nrow=8)
for(i in 1:8) {
 M[,i] <- ifelse(Im(eigen(A)$val[i]) == 0, eigen(A)$vec[**1**,i], 0)
}

(BTW 实际上生成与上面代码完全相同的输出)。我的误解在哪里?

我通过 R-help@r-project.org 找到了解决方案:这不是矩阵或 for i 循环行为的问题,而是 ifelse 的问题,它在 R 中的行为与例如非常不同C中的ifelse。所以处理我的想法的正确方法是:

for(i in 1:8) {
     M[,i] <- if(Im(eigen(A)$val[i]) == 0) eigen(A)$vec[,i] else 0
 }