我有一个未排序的特征值向量和一个相关的特征向量矩阵.我想根据排序的特征值集对矩阵的列进行排序.(例如,如果特征值[3]移动到特征值[2],我希望特征向量矩阵的第3列移到第2列.)
我知道我可以对O(N log N)via中的特征值进行排序std::sort.如果不滚动我自己的排序算法,我如何确保矩阵的列(相关的特征向量)跟随它们的特征值,因为后者是排序的?
好的,我使用以下库:http://www.codeproject.com/KB/recipes/AdvancedMatrixLibrary.aspx
我希望计算某些矩阵的特征向量.我不知道如何制定代码.
到目前为止,我尝试过:
Matrix MatrixName = new Matrix(n, n);
Matrix vector = new Matrix(n, 0);
Matrix values = new Matrix(n, 0);
Matrix.Eigen(MatrixName[n, n], values, vector);
Run Code Online (Sandbox Code Playgroud)
但是它说最好的重载方法匹配有一些无效的参数.我知道图书馆有效,但我不知道如何制定我的c#代码.
任何帮助都会很棒!
试图使用scipy的linalg.eig来解决广义特征值问题.然后我检查我得到的解决方案,似乎没有返回正确的特征向量.此外,文档建议返回的向量是规范化的,但事实并非如此(尽管这并不会让我感到烦恼).
以下是样本矩阵:
>>> a
array([[ 2.05630374e-01, 8.89584493e-10, -1.46171715e-06],
[ 8.89584493e-10, 2.38374743e-02, 9.43440334e-06],
[ -1.46171715e-06, 9.43440334e-06, 1.39685787e-02]])
>>> b
array([[ 0.22501692, -0.07509864, -0.05774453],
[-0.07509864, 0.02569336, 0.01976284],
[-0.05774453, 0.01976284, 0.01524993]])
Run Code Online (Sandbox Code Playgroud)
运行eig我得到:
>>> w,v = linalg.eig(a,b)
>>> w
array([ 3.08431414e-01+0.j, 5.31170281e+01+0.j, 6.06298605e+02+0.j])
>>> v
array([[-0.26014092, -0.46277857, -0.0224057 ],
[ 0.76112351, -0.59384527, -0.83594841],
[ 1. , -1. , 1. ]])
Run Code Online (Sandbox Code Playgroud)
然后测试结果:
>>> a*v[:,0]
array([[ -5.34928750e-02, 6.77083674e-10, -1.46171715e-06],
[ -2.31417329e-10, 1.81432622e-02, 9.43440334e-06],
[ 3.80252446e-07, 7.18074620e-06, 1.39685787e-02]])
>>> w[0]*b*v[:,0]
array([[-0.01805437+0.j, -0.01762974+0.j, -0.01781023+0.j],
[ 0.00602559-0.j, 0.00603163+0.j, 0.00609548+0.j], …Run Code Online (Sandbox Code Playgroud) 我已经看到了这个问题,这与我尝试用numPy在Python中计算主导特征向量有关.
我试图计算nxn矩阵的主要特征向量,而不必进入过多的重线性代数.我对行列式,特征值,特征向量和特征多项式进行了粗略的研究,但我更倾向于依靠numPy实现来寻找特征值,因为我认为它比我自己的效率更高.
我遇到的问题是我使用了这段代码:
markov = array([[0.8,0.2],[.1,.9]])
print eig(markov)
Run Code Online (Sandbox Code Playgroud)
...作为测试,并获得此输出:
(array([ 0.7, 1. ]), array([[-0.89442719, -0.70710678],
[ 0.4472136 , -0.70710678]]))
Run Code Online (Sandbox Code Playgroud)
我关注的是,根据Perron-Frobenius定理,第二个特征向量的所有分量都应该是正的(因为,根据维基百科,"具有正条目的实矩阵具有唯一的最大实特征值并且相应的特征向量具有严格的正分量").
谁知道这里发生了什么?numPy错了吗?我在ZFC中发现了不一致吗?或者只是我在线性代数,Python,numPy或三者的某种组合中成为一个菜鸟?
感谢您提供的任何帮助.另外,这是我的第一个SO问题(我曾经活跃于cstheory.se),所以任何有关提高我的问题清晰度的建议也会受到赞赏.
我正在尝试找到以下矩阵的特征值/向量:
A = np.array([[1, 0, 0],
[0, 1, 0],
[1, 1, 0]])
Run Code Online (Sandbox Code Playgroud)
使用代码:
from numpy import linalg as LA
e_vals, e_vecs = LA.eig(A)
Run Code Online (Sandbox Code Playgroud)
我得到这个作为答案:
print(e_vals)
[ 0. 1. 1.]
print(e_vecs)
[[ 0. 0.70710678 0. ]
[ 0. 0. 0.70710678]
[ 1. 0.70710678 0.70710678]]
Run Code Online (Sandbox Code Playgroud)
但是,我相信以下应该是答案。
[1] Real Eigenvalue = 0.00000
[1] Real Eigenvector:
0.00000
0.00000
1.00000
[2] Real Eigenvalue = 1.00000
[2] Real Eigenvector:
1.00000
0.00000
1.00000
[3] Real Eigenvalue = 1.00000
[3] Real Eigenvector:
0.00000
1.00000
1.00000
Run Code Online (Sandbox Code Playgroud)
也就是说,特征值-特征向量问题表明以下内容应成立:
# A …Run Code Online (Sandbox Code Playgroud) 考虑真实的对称矩阵
S = (2, 1; 1, 2)
Run Code Online (Sandbox Code Playgroud)
从特征方程| S - λI|,我们得到二次方(2-λ)^ 2 - 1 = 0,其解得到特征值3和1.相应的特征向量是(1; -1)和(1; 1).
octave:4> [V,lambda] = eig([2, 1; 1,2])
V =
-0.70711 0.70711
0.70711 0.70711
lambda =
Diagonal Matrix
1 0
0 3
Run Code Online (Sandbox Code Playgroud)
为什么八度音程中的特征向量[-0.70711; 0.70711]和[0.70711; 0.70711]
我有一个具有很多简并特征值的实对称矩阵,我想找到该矩阵的实值特征向量。我正在努力寻找 numpy 或 scipy 中的一种方法来为我做到这一点,我尝试过的方法给出了复值特征向量。有谁知道这样的功能是否存在?
我是C ++编程的新手,但我有一个任务是为尺寸很大的矩阵计算对称矩阵(和Hermitian)的特征值和特征向量(标准本征问题Ax = lx)):Binomial(L,L / 2)其中L大约是18-22岁。现在,我正在具有7.7 GB可用内存的机器上对其进行测试,但最终我将可以访问具有64GB RAM的PC。
我从Lapack ++开始。一开始,我的项目假设仅针对对称实矩阵解决此问题。
这个图书馆很棒。非常快速且占用少量RAM。它具有计算特征向量并将其放置在输入矩阵A中的选项,以节省内存。有用!我以为Lapack ++ eigensolver可以处理Hermitian矩阵,但是由于未知的原因而不能(也许我做错了)。我的项目不断发展,对于埃尔米特矩阵,我也应该能够计算出这个问题。
因此,我尝试将库更改为Armadillo库。它可以正常工作,但是不如Lapack ++取代mat Aall eigenvec,但它当然支持埃尔米特矩阵。
L = 14的一些统计
Lapack ++ RAM 126MB时间7.9s本征+本征向量
犰狳 RAM 216MB时间12s本征
Armadillo RAM 396MB时间15s本征值+本征向量
让我们做一些计算:double变量大约是8B。我的矩阵的大小为
binomial(14,7)= 3432,因此在理想情况下它应具有3432 ^ 2 * 8/1024 ^ 2 = 89 MB。
我的问题是:是否可以修改或强制Armadillo像Lapack ++一样做一个不错的技巧?犰狳的用法LAPACK和BLAS例程。或者,也许有人可以推荐使用另一个库解决此问题的另一种方法? …
我在100张图片上使用PCA.我的训练数据是442368x100 double矩阵.442368是特征,100是图像的数量.这是我找到特征向量的代码.
[ rows, cols] = size(training);
maxVec=rows;
maxVec=min(maxVec,rows);
train_mean=mean(training,2);
A=training-train_mean*ones(1,cols);
A=A'*A;
[evec,eval]=eig(A);
[eval ind] = sort(-1*diag(eval));
evec= evec(:, ind(1:100));
Run Code Online (Sandbox Code Playgroud)
现在evec是一个100x100倍的特征向量矩阵,现在我有100个特征向量排序.
问题:
现在,如果我想使用上面计算的特征向量转换我的测试数据,那么我该如何使用这些特征向量?我的测试数据是442368x50 double我的特征向量矩阵100x100 double.内部矩阵尺寸不一致.如何找到测试数据和特征向量矩阵的点积?
我有刚度矩阵和质量矩阵.我想计算我的结构振动形状和周期(特征值/向量),所以我使用NumPy.特征值与MATLAB给出的特征值相同,但是当我将特征向量与MATLAB给出的特征向量进行比较时,我发现了一些小的(小于1E-10)差异.
为什么会这样,我怎样才能使两个结果相等?
我试图提高NumPy的精度,但它没有用.
import numpy as np
#S Stiffness Matrix
#M Mass Matrix
w, f = np.linalg.eig(np.linalg.inv(M)@S)
Run Code Online (Sandbox Code Playgroud)
这是我的结果
来自NumPy的第一个特征向量:
0.0
0.0
0.0
0.631781280460724
-1.4298382510485397e-09
-8.755329688057342e-26
0.7392387400169079
7.709528714838357e-10
1.3560471632542145e-24 # Different sign here
0.23319197867341496
1.88087901696399e-09
-4.7286506166123194e-17 # Different sign here
Run Code Online (Sandbox Code Playgroud)
来自MATLAB的第一个特征向量:
0
0
0
6.317812804607240e-01
-1.429838251048596e-09
-8.755233867348009e-26
7.392387400169076e-01
7.709528714837307e-10
-2.624482888541565e-24 % Different sign here
2.331919786734153e-01
1.880879016947830e-09
8.178753965460107e-17 % Different sign here
Run Code Online (Sandbox Code Playgroud)