我试图在C代码中找到一个程序,它允许我计算方阵的特征值(谱)分解.我特意试图找到最高特征值(因此其相关的特征值)位于第一列的代码.
我需要输出按此顺序的原因是因为我试图计算特征向量中心性,因此我只需要计算与最高特征值相关联的特征向量.提前致谢!
我看了看eigvecs和eigen,但他们都没有通过特征值的数量级的特征向量.这是我们必须自己编码的东西吗?
testM=diagm(0=>[1,3,2])
eigvals(testM)
eigvecs(testM)
U=eigen(testM)
U.vectors
U.values
Run Code Online (Sandbox Code Playgroud) 我的目的是找到矩阵的特征向量.在Matlab中,有一个[V,D] = eig(M)用于得到矩阵的特征向量:[V,D] = eig(M).或者,我使用WolframAlpha网站来仔细检查我的结果.
我们有一个10X10矩阵叫M:
0.736538062307847 -0.638137874226607 -0.409041107160722 -0.221115060391256 -0.947102932298308 0.0307937582853794 1.23891356582639 1.23213871779652 0.763885436104244 -0.805948245321096
-1.00495215920171 -0.563583317483057 -0.250162608745252 0.0837145788064272 -0.201241986127792 -0.0351472158148094 -1.36303599752928 0.00983020375259212 -0.627205458137858 0.415060573134481
0.372470672825535 -0.356014310976260 -0.331871925811400 0.151334279460039 0.0983275066581362 -0.0189726910991071 0.0261595600177302 -0.752014960080128 -0.00643718050231003 0.802097123260581
1.26898635468390 -0.444779390923673 0.524988731629985 0.908008064819586 -1.66569084499144 -0.197045800083481 1.04250295411159 -0.826891197039745 2.22636770820512 0.226979917020922
-0.307384714237346 0.00930402052877782 0.213893752473805 -1.05326116146192 -0.487883985126739 0.0237598951768898 -0.224080566774865 0.153775526014521 -1.93899137944122 -0.300158630162419
7.04441299430365 -1.34338456640793 -0.461083493351887 5.30708311554706 -3.82919170270243 -2.18976040860706 6.38272280044908 2.33331906669527 9.21369926457948 -2.11599193328696
1 0 0 0 …Run Code Online (Sandbox Code Playgroud) 我很难确定马尔可夫模型的平稳分布。我开始理解理论和联系:给定一个随机矩阵,要确定平稳分布,我们需要找到最大特征值(即 1)的特征向量
我从生成一个随机矩阵开始
set.seed(6534)
stoma <- matrix(abs(rnorm(25)), nrow=5, ncol=5)
stoma <- (stoma)/rowSums(stoma) # that should make it a stochastic matrix rowSums(stoma) == 1
Run Code Online (Sandbox Code Playgroud)
之后我使用Reigen函数
ew <- eigen(stoma)
Run Code Online (Sandbox Code Playgroud)
但我不明白结果
> ew
$values
[1] 1.000000e+00+0.000000e+00i -6.038961e-02+0.000000e+00i -3.991160e-17+0.000000e+00i
[4] -1.900754e-17+1.345763e-17i -1.900754e-17-1.345763e-17i
$vectors
[,1] [,2] [,3] [,4] [,5]
[1,] -0.4472136+0i 0.81018968+0i 0.3647755+0i -0.0112889+0.1658253i -0.0112889-0.1658253i
[2,] -0.4472136+0i 0.45927081+0i -0.7687393+0i 0.5314923-0.1790588i 0.5314923+0.1790588i
[3,] -0.4472136+0i 0.16233945+0i 0.2128250+0i -0.7093859+0.0000000i -0.7093859+0.0000000i
[4,] -0.4472136+0i -0.09217315+0i 0.4214660+0i -0.1305497-0.1261247i -0.1305497+0.1261247i
[5,] -0.4472136+0i -0.31275073+0i -0.2303272+0i 0.3197321+0.1393583i 0.3197321-0.1393583i
Run Code Online (Sandbox Code Playgroud)
最大值 (1) 的向量具有所有相同的分量值“-0.4472136”。即使我改变种子,绘制不同的数字,我也会再次得到相同的值。我想念什么?为什么特征向量的分量都是相等的?为什么它们的总和不等于 1 …
根据http://arma.sourceforge.net/docs.html#part_c,Armadillo支持以下功能:
eig_sym
eig_gen
eigs_sym
eigs_gen
svd
svd_econ
Run Code Online (Sandbox Code Playgroud)
但似乎没有像"svds_econ"这样的函数,它在"稀疏"矩阵上运行并返回奇异值和向量.
有没有办法在Armadillo中实现这个功能?
我有一个数据集x。我用它cov(x)来计算 的协方差x。我想计算 的倒数平方根cov(x)。但我得到 的负特征值cov(x)。
这是我的代码
S11=cov(x)
S=eigen(S11,symmetric=TRUE)
R=solve(S$vectors %*% diag(sqrt(S$values)) %*% t(S$vectors))
Run Code Online (Sandbox Code Playgroud)
这就是 的特征值S。
c(0.897249923338732, 0.814314811717616, 0.437109871173458, 0.334921280373883,
0.291910583884559, 0.257388456770167, 0.166787180227719, 0.148268784967556,
0.121401731579852, 0.0588333377333529, 0.0519459283467876, 0.0472867806813002,
0.0438199555429584, 0.0355421239839632, 0.0325106968911777, 0.0282860419784165,
0.0222240269478354, 0.0174657163114068, 0.012318267910606, 0.00980611646284724,
0.00969450391092417, 0.00804912897151307, 0.00788628666010145,
0.00681419055130702, 0.00664707528670254, 0.00591471779140177,
0.00581608875646686, 0.0057489828718098, 0.00564645095578336,
0.00521029715741059, 0.00503304953884416, 0.0048677189522647,
0.00395692706081966, 0.00391665618240403, 0.00389825739725093,
0.00383611535401152, 0.00374242176786387, 0.0035160324422885,
0.00299245160843966, 0.0029501156885799, 0.00289484923017341,
0.00287327878694529, 0.0028447265712214, 0.00274130080219099,
0.00273159993035393, 0.00265595612239575, 0.00261856622830277,
0.0020004125628823, 0.00199834766485368, 0.00199579695856402,
0.00198945452395265, 0.00197999810684363, 0.00195954105720554,
0.00195502875017394, …Run Code Online (Sandbox Code Playgroud) 如果矩阵A和B的联合特征值被定义为方程 det(lambda * A - B ) = 0 的根,我如何在 MATLAB 中解决这个问题?
特别是,我不确定 lambda 是如何定义的——它显然需要是一个矩阵或向量,否则只会有一个联合特征值。另外,我不确定是否有任何内置函数,或者是否需要使用 fzero 来查找非线性函数的根。
有了prcomp()函数,我估计了方差百分比的解释
prcomp(env, scale=TRUE)
Run Code Online (Sandbox Code Playgroud)
第二列summary(pca)显示了所有PC的这些值:
PC1 PC2 PC3 PC4 PC5 PC6 PC7
Standard deviation 7.3712 5.8731 2.04668 1.42385 1.13276 0.79209 0.74043
Proportion of Variance 0.5488 0.3484 0.04231 0.02048 0.01296 0.00634 0.00554
Cumulative Proportion 0.5488 0.8972 0.93956 0.96004 0.97300 0.97933 0.98487
Run Code Online (Sandbox Code Playgroud)
现在,我想查找每台PC的特征值:
pca$sdev^2
[1] 5.433409e+01 3.449329e+01 4.188887e+00 2.027337e+00 1.283144e+00
[6] 6.274083e-01 5.482343e-01
Run Code Online (Sandbox Code Playgroud)
但是这些值似乎只是PVE本身的替代表示。那我在做什么错呢?
我有以下矩阵
M <- structure(c(0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
0, 0, 1, 0, 0, 0, 1, 0), .Dim = c(5L, 5L))
Run Code Online (Sandbox Code Playgroud)
我想找到正好为1的特征值.我认为这样可行:
Re(eigen(M)$values) == 1 & Im(eigen(M)$values) == 0
Run Code Online (Sandbox Code Playgroud)
但Re(eigen(M)$values) == 1不认为第5个特征值等于1,即使它确实如此.我错过了什么?
编辑:只要它指出了一个浮点问题,我研究了一点,了解几种解决方案,包括使用abs(value) < tol,all.equal和signif.答案可以讨论这些选项吗?
我有一个6000*6000对称矩阵,所有条目都是正数.我使用matlab的eig函数来分解它的特征值和特征向量.但结果中存在负特征值.你认为这是什么问题?
谢谢.Sevil.
我想使用Matlab的"princomp"函数,但是这个函数给出了一个排序数组中的特征值.这样我就无法找出哪个列对应哪个特征值.对于Matlab,
m = [1,2,3;4,5,6;7,8,9];
[pc,score,latent] = princomp(m);
Run Code Online (Sandbox Code Playgroud)
是相同的
m = [2,1,3;5,4,6;8,7,9];
[pc,score,latent] = princomp(m);
Run Code Online (Sandbox Code Playgroud)
也就是说,交换前两列不会改变任何东西.潜在的结果(特征值)将是:(27,0,0)信息(特征值对应于哪个原始(输入)列)丢失.有没有办法告诉matlab不要对特征值进行排序?
eigenvalue ×11
eigenvector ×4
matlab ×4
r ×4
matrix ×2
pca ×2
armadillo ×1
c ×1
c++ ×1
julia ×1
svd ×1
wolframalpha ×1