我试图在C代码中找到一个程序,它允许我计算方阵的特征值(谱)分解.我特意试图找到最高特征值(因此其相关的特征值)位于第一列的代码.
我需要输出按此顺序的原因是因为我试图计算特征向量中心性,因此我只需要计算与最高特征值相关联的特征向量.提前致谢!
我试图将广义特征值问题转换为正常的特征值计算.
我有这个代码:
[V,D,flag] = eigs(A, T);
现在我把它转换成:
A1 = inv(T)*A;
[V1,D1,flag1] = eigs(A1);
Run Code Online (Sandbox Code Playgroud)
我不应该得到相同的结果?根据我在Matlab文档中的理解,第一个等式解决了:
A*V = B*V*D
Run Code Online (Sandbox Code Playgroud)
第二个解决了:
A*V = V*D
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 …
我想用Numpy来计算特征值和特征向量.这是我的代码:
import numpy as np
from numpy import linalg as LA
lapl = np.array(
[[ 2, -1, -1, 0, 0, 0],
[-1, 3, 0, -1, 0, -1],
[-1, 0, 2, -1, 0, 0],
[ 0, -1, -1, 3, -1, 0],
[ 0, 0, 0, -1, 2, -1],
[ 0, -1, 0, 0, -1, 2]])
w, v = LA.eigh(lapl)
print ('Eigenvalues:', np.round(w,0))
print ('Eigenvectors:', np.round(v,2))
Run Code Online (Sandbox Code Playgroud)
结果如下:
Eigenvalues: [ 0. 1. 2. 3. 3. 5.]
Eigenvectors: [[ 0.41 0.5 0.41 -0.46 0.34 …Run Code Online (Sandbox Code Playgroud) 我是一个新的Julia用户,我需要尽快找到大矩阵的特征向量*.我无法让Julia以与Matlab一样快的速度运行以下示例:
朱莉娅
const j = 1000 ::Int
A = Array{Float64}(j,j)
B = Array{Float64}(j,j)
f(x) = eigvecs(x)
A = randn(j,j)
B = f(A)
@time f(A)
Run Code Online (Sandbox Code Playgroud)
输出时间:2.950973秒(12.31 k分配:76.445 MB,0.11%gc时间)
MATLAB
j = 1000;
A = randn(j,j);
tic
[v, d] = eig(A);
toc
Run Code Online (Sandbox Code Playgroud)
经过的时间是1.161133秒.
我还检查了Matlab的1个线程,使用maxNumCompThreads = 1进行比较,但它仍然提供了与之前类似的时间(1.16s).我也尝试通过运行两次预编译加速Julia,并设置blas_set_num_threads(4)但这没有帮助.
我真的很感激有关如何改进我的Julia代码的任何建议!
*(我在OSX El Capitan 10.11.6上使用Matlab 2015b和Julia 0.4.7)
我一直在使用NumPy来做一些线性代数,但是我遇到了eigh()看似返回不正确的特征向量的问题.这是我正在使用的对称矩阵(481乘481).看下面的代码:
import numpy as np
c = np.load('C.npy')
eigenvectors_h = np.linalg.eigh(c)[1]
c.dot(eigenvectors_h[:, 0]) / eigenvectors_h[:, 0]
Run Code Online (Sandbox Code Playgroud)
c是真实的,因为np.allclose(c, c.T)回归肯定是对称的True.
而不是得到一个由特征值组成的数组重复481次,而不是看到什么看起来像随机数:
-1.03913672e+04 1.70145524e-15 -6.30342977e-16 -5.80181781e-15
2.43586988e-15 1.02142854e-13 -1.59100453e-13 6.34768223e-14
1.47793139e-14 5.19832084e-15 1.23786159e-14 -6.89332604e-14
3.35120474e-14 -5.55497774e-14 3.35912194e-14 2.41599711e-14
-8.10853045e-15 3.39728566e-14 1.66605768e-14 -4.62536283e-14
4.78158644e-15 1.05840004e-14 2.49968277e-14 6.37161752e-14
-8.29049452e-15 7.69540224e-13 -1.41737099e-14 -2.04904903e-14
-2.02649833e-14 8.75614182e-15 -6.43718154e-14 -6.71884701e-15
2.89567850e-15 -1.93639427e-14 2.05961830e-15 -2.82825321e-14
-2.99156760e-14 -1.17149803e-14 -1.00413883e-13 2.81365540e-15
-1.47420105e-14 -1.54638301e-14 2.97770540e-14 9.42616109e-14
-2.18819275e-13 6.23156105e-13 -1.14148906e-14 1.97147438e-14
-5.04103330e-14 -1.39415849e-13 -6.78032159e-14 -2.18085326e-14
-1.36511305e-14 3.09529929e-14 …Run Code Online (Sandbox Code Playgroud) 我需要使用PCA显示前10个特征脸,用于图像特征向量矩阵.
我正在使用以下matlab代码来创建第一个特征脸,但我变得非常黑暗并且不那么正确的特征脸.eFea是240x4096的矩阵,其中每行代表64x64的图像
newData = eFea';
data = newData;
[M,N] = size(data);
mn = mean(data,2);
data = double(data) - repmat(mn,1,N);
% construct the matrix Y
Y = data' / sqrt(N-1);
% SVD
[u,S,PC] = svd(Y,0);
imshow(reshape(PC(1,:),64,64))
Run Code Online (Sandbox Code Playgroud)
关于代码中的错误的任何提示都会有所帮助.
eigenvector ×8
eigenvalue ×4
matlab ×4
numpy ×2
python ×2
benchmarking ×1
c ×1
julia ×1
r ×1
wolframalpha ×1