我希望将矩阵中的任何复杂特征向量/值分离成实部和虚部,分类为所有实值的新矩阵,其中任何复共轭对的实部都在自己的列中,而虚部现在是其自己列中的实部......如果我的 3x3 矩阵给我这些特征向量,那么用一个例子来展示可能更容易:
[,1] [,2] [,3]
[1,] 0.3-0.4i 0.3+0.4i -0.6+0i
[2,] 0.3+0.1i 0.3-0.1i -0.8+0i
[3,] 0.8+0.0i 0.8+0.0i 0.1+0i
我希望我的代码创建一个如下所示的矩阵:
[,1] [,2] [,3]
[1,] 0.3 0.4 -0.6
[2,] 0.3 0.1 -0.8
[3,] 0.8 0.0 0.1
我想我不在乎 [3,2] 中的零是 NA 还是 0。
我是 R 编码的初学者。我尝试迭代地执行此操作,这可能是错误的方法,并且查看我的尝试,现在很明显为什么它不起作用,但我想包含它以向您展示您正在使用的内容。任何指导或提示将不胜感激!
dispersal_matrix = matrix(c( 1,-2,-3,
-1, 1, 3,
2, 1, 3), nrow=3)
d = 3 #in the end the user needs to be able to choose how many eigenvectors they want
right_eigs = eigen(dispersal_matrix)
n = nrow(dispersal_matrix)
all_eigenvectors = right_eigs$vectors
real_split_eigenvectors = matrix(nrow = n, ncol = d)
is_conj = FALSE
for(j in 1:d){
for(i in 1:n){
if(abs(Im(all_eigenvectors[i,j]))>1e-8){
real_split_eigenvectors[i,j] = Re(all_eigenvectors[i,j])
real_split_eigenvectors[i,j+1] = Im(all_eigenvectors[i,j])
is_conj = TRUE
}
else{
real_split_eigenvectors[i,j] = Re(all_eigenvectors[i,j])
}
}
if(is_conj == TRUE) {
j+1
is_conj = FALSE
}
}
顶部的示例四舍五入,以便于阅读。
is_conj = FALSE
for(j in 1:d){ # << PHI >> RIGHT eigenvectors real matrix
if(any(abs(Im(Phi_complex[,j]))<1e-8)){
Phi_real[,j] = Re(Phi_complex[,j])
} else if(is_conj ){
Phi_real[,j] = Im(Phi_complex[,j])
is_conj = FALSE # switches the state of the conjugate variable to false so the next round of the loop will go to the next step in the if-else chain
}else {
Phi_real[,j] = Re(Phi_complex[,j])
is_conj = TRUE # returns the conjugate state back to TRUE for the loop
}
}
我在朋友的帮助下的解决方案