Friday, February 09, 2007

Eigenvectors of 3x3 symmetric matrix

A C++ source and header file to compute eigenvectors/values of a 3x3 symmetric matrix. Potentially easier than installing EISPACK, LAPACK, or Gandalf if you only need this single function. Takes about 6000 clock cycles per call on my Pentium 4. Public domain. [1]


Anonymous said...

Hi Connelly,

Thanks for the eigensystem code. I need to find the magnitude and direction of the principle axes of a covariance matrix and plot the resulting ellipsoid. This should save me a bunch of time.


Connelly Barnes said...

No problem. I used this code to plot level sets of quadric error functions when implementing Garland and Heckbert's mesh simplification paper [1], so like you, I was plotting ellipsoids.

Anonymous said...

Hi Connelly,
I found an error in the code. When I was testing the next matrix:

0 -0.00018 0.01718
0.00016 5e-05 0.01373
-0.01474 -0.0225 0.43942

The results are:

-0.00146067 -0.000130409 0.441061
0.520977 0.852918 -0.0333759
0.851398 -0.522042 -0.0509365
0.0608683 0.00187936 0.998144

This results are different in MATLAB. Is it normal?

Anonymous said...

This should work only for 3x3 *symmetric* matrix. The next matrix doesn't seem to be symmetric to me.
Thanks for the code.

Anonymous said...

I need to find only an eigenvector corresponding to the smallest eigenvalue. Is there something faster for that?

Connelly Barnes said...

For more speed, if you need the eigenvector for the eigenvalue of smallest or largest absolute value, you can try power iteration [1] or inverse power iteration [2]. You might be able to get two eigenvectors by using both power iteration and inverse iteration. The third can be obtained by a cross product. Once you have one eigenvector you can also try reducing the dimension of the problem by one (by projecting on to vectors orthogonal to the found eigenvector) and then solving again by any method of your choice. Once you get to two dimensions there is a nice closed form formula for the eigenvectors based on the quadratic formula.

It would be interesting to see how few clock cycles are needed for solving the 3x3 and 4x4 problems for the symmetric and non-symmetric cases. Maybe there's already code out there which solves these problems quickly; does any one know where it is?

For generality, you can change the constant N given in the code to solve for whichever dimension you need. Changing N to a variable might slow down the optimizer; I didn't check. If solving for a non-symmetric matrix, you can steal the code needed from the public domain package JAMA [3].

Connelly Barnes said...

One might also try solving the characteristic polynomial for eigenvalues and then using linear algebra to solve for the associated eigenvectors. Using one of the aforementioned techniques for the 3x3 case, one could probably speed up the code by an order of magnitude.

Xavier Garcia said...

Hi, thanks for the code. It worked fine for me.

Anonymous said...

Thanks you for your code. I will use it (until write my own) to calculate OBBs (object oriented boxes), that are used in computer graphics for interference detection.

Anonymous said...

I am having a lot of trouble finding the eigen vectors of a non symmetric matrix..Is their any way you would know how to go about it

Anonymous said...

just what I was looking for.


Anonymous said...

Seems to have slightly different output than with MATLAB.
For example for input=

1.0000 0.9794 0.6967
0.9794 1.0000 0.7742
0.6967 0.7742 1.0000

in MATLAB I get:
Eigenvectors =

-0.5890 -0.6535 -0.4754
-0.6049 0.7466 -0.2769
-0.5359 -0.1245 0.8351

Eigenvalues =


While with your code I get:
Eigenvectors =
-0.65348666890016993 -0.47540875028028978 0.58901756656885285
0.74663228601038611 -0.27687590315051447 0.60488012344719444
-0.12448053284214880 0.83506062918300739 0.53589023365966881


As you can see, the signs on the right column eigenvector are different to the first column at MATLAB (which are the same eigenvector)...
I suppose there is a bug?


Connelly Barnes said...

DK - No bug. If A * v = lambda * v, then A * (-v) = lambda * (-v) also, so if v is an eigenvector then -v is also, and eigenvectors aren't uniquely defined up to sign.

Unknown said...

Hi Connelly,

Thanks for the code. It works fine for 3X3 symmetric matrix. Although, I was just curious to know which algorithm they have applied to calculate the eigenvalues and especially for eigenvectors.

I was trying to implement Row Reduced Echelon form method to calculate the eigenvector, but unfortunately it didn't work as I would have expected.

Thanks again.

Anonymous said...

Thank you very much for your code

Sildenafil Citrate said...

I tried this code for 3X3 symmetric matrix, and I had a couple of problems and I hope that somebody could help me work this out, thanks in advance!

اليوتيوب said...

i download this i will need it

Anonymous said...

I've been reading the blog and I love the way like you redact the information, specially when you attached Generic Viagra on the blogroll. 23jj

asdfg said...

Hey Connelly,
even if this thread is not perfectly recent, perhaps someone using the code could help me: At line 193 d[m] is accessed, after m may be incremented up to 3 by lines 159ff. as d should be of length 3, this is a problem. Also later, in the loop @ 200ff m being 3 leads to out-of-bounds indices.
Do you have any advice. I don't really know the algorithm, so it's hard to solve that.

asdfg said...

Sorry, had a typo in the syntax conversion (needed it in python). m=3 cannot occur in this algorithm.
Another remark: in the resulting matrix, V[i] is not the ith Eigenvector, but [V[0][i],V[1][i],V[2][i]] is.

Photonyx said...

Hi Connelly,

Thanks for the code, works like a charm!

David Doria said...


Thanks, this is really useful. It might be nice to include a demo like this to indicate the ordering properties of the arrays:


#include "eig3.h"

int main(int argc, char*argv[])

// Create the matrix
// (1 4 0)
// (4 2 0)
// (0 0 5)
double A[3][3];
A[0][0] = 1;
A[0][1] = 4;
A[0][2] = 0;
A[1][0] = 4;
A[1][1] = 2;
A[1][2] = 0;
A[2][0] = 0;
A[2][1] = 0;
A[2][2] = 5;

// Allocate memory for the eigenvalues/vectors
double V[3][3];
double d[3];

// Perform the decomposition
eigen_decomposition(A, V, d);

// Output the result
std::cout << "Eigenvalues: " << d[0] << " " << d[1] << " " << d[2] << std::endl;

std::cout << "Eigenvector 0: " << V[0][0] << " " << V[1][0] << " " << V[2][0] << std::endl;
std::cout << "Eigenvector 1: " << V[0][1] << " " << V[1][1] << " " << V[2][1] << std::endl;
std::cout << "Eigenvector 2: " << V[0][2] << " " << V[1][2] << " " << V[2][2] << std::endl;

return 0;


Unknown said...

undefined reference to 'WinMain@16'
ld returned 1 exit status.
I'm using Dev C++
and I was to encounter this message and the program does not run.
Should I change something in the code or what? Thank You Connelly.

Unknown said...

hi.i want to use c++ to decompose received signal in order to obtain the eigen values and vector. please can you explain. thanks

Unknown said...

شركة المثالية للتنظيف بالهفوف

bes said...

I am having a lot of trouble finding the eigen vectors of a non symmetric matrix..Is their any way you would know how to go about it
مسك كلمات في جوجل
مقابر للبيع بمحافظة القاهرة
مقابر للبيع
مقابر للبيع مدينة السلام
تسويق عبر الفيديو
افضل شركة سيو في مصر
مدافن للبيع
خبير سيو

admin said...

قياس سرعة النت
حساب كتلة الجسم BMI
محرر الاكواد
منتقي الالوان
حساب العمر
فوتوشوب اون لاين
فوتوشوب أون لاين

monaser said...

صب الحواجز الخرسانية للبيع بالرياض
منتجات خرسانية
هناك أنواع عديدة من صب الحواجز الخرسانية، من أبرزها “نيوجيرسي” ، والتي تستخدم لفصل الطرق أو رسم مسارات المرور وبالمثل يمكن استخدام حاجز نيوجيرسي لحماية الناس من خطر الانحراف عن السيارات، وكذلك لحماية المنشآت.

تُستخدم صب الحواجز نيوجيرسي لفصل منطقة عن أخرى، أو للممرات المباشرة، وتُستخدم أيضًا كبنية تحتية في المدن الكبيرة، ويمكن صبها ميكانيكيًا أو تصنيعها في ورش التحضير، حواجز الطرق في نيوجيرسي قوية جدًا، لذا يمكن استخدامها في المناطق الصحراوية الحارة، لأن هذه المناطق غالبًا ما يتم حفرها واستكشافها، وبعضها قريب من الطرق، لذلك هناك حاجة إلى صب حواجز للطرق خرسانية قوية مثل حواجز نيوجيرسي.

الرياض مدينة سكنية محاطة بالمباني السكنية والمرافق العامة، ويوجد على الحدود مناظر صناعية، لذلك يجب استخدام حواجز خرسانية مختلفة لحماية الأفراد من مخاطر الحوادث المرورية من خلال الاستعانة بنا.

يوجد العديد من أنواع المصدات الخرسانية القوية التي ينتجها مصنع صبات خرسانية في الرياض لها استخدامات متنوعة، لأن هذه المصدات تستخدم في الكباري ذات الشقوق أو والتصدعات في الشوارع، فهي ليست فقط أمور أساسية في أنفاق الطرق أو الكباري نظرًا لاستخدامها لعزل جزء من النفق الذي يحتاج إلى الإصلاح، فإن الطلب على الحواجز الخرسانية هو أحد أسس الطريق.

كراسي خرسانية بالرياض
تستخدم الكراسي الخرسانية بشكل رئيسي في المرافق العامة مثل الحدائق والأماكن المزدحمة بشكل متكرر، وهي من الحلول العملية للقضاء على مشكلة الازدحام، لأنها مستقرة وقوية ومتينة لسنوات عديدة، ولا تتأثر بتغير المناخ ولن تتضرر من هطول الأمطار في الشتاء وذلك لأن تكوينتها صلبه.

من أكبر المشكلات التي تواجه مصانع الإنشاءات الخرسانية الاستقرار وعدم التفاعل مع العوامل المتغيرة، لكن مصنع صبات خرسانية بالرياض استطاع التغلب عليها بتطوير مواد أولية للحواجز واختيار مواد جديدة سهلة الاستخدام لصنع كراسي خرسانية قوية لهذه المشكلة.
منتجات اسمنتية
كراسي خرسانية للحدائق بالرياض
يعتبر كرسي خرسانية للحدائق من أحدث المنتجات التي نفذها المصنع مؤخرًا، لأن الكراسي الخرسانية تستخدم أيضًا في الأماكن العامة وتستخدم في العديد من الأماكن المزدحمة (مثل محطات القطارات ومحطات مترو الأنفاق)، وقد تجدها في بعض المنتجعات والمساكن والفنادق.

هناك أنواع عديدة من الكراسي الخرسانية، ليس فقط مقاعد ولكن أيضًا مقاعد ومساند للذراعين آمنة ويمكن استخدامها بشكل فردي، لا يمكن أن تتفاعل منتجات المصانع (خاصة الكراسي الخرسانية) مع عوامل الطقس المتغيرة، مما يجعلها الخيار الأفضل لكثير من الناس لأنها مصنوعة أيضًا من مواد عازلة للحرارة ومقاومة للرطوبة ومقاومة للماء، لذلك لن تشعر بذلك في الصيف الحرارة الشديدة أو البرودة الشديدة في الشتاء.

Deepika Verma said...

Jaipur to Fatehpur Sikri Taxi

cemetries said...

amazing article thanks for sharing such a super article
مقابر للبيع

Top Android said...

توب اندرويد
العاب مهكرة


تطبيقات انمي

تطبيقات بث مباشر

EL-Nawasany said...

قبل إحضار حيازتك الثمينة إلى ورشة الإصلاح ، تحتاج إلى التحقق مما إذا كانت لا تزال مشمولة بالضمان. إذا كان الأمر كذلك ، فاتصل بالموزع الخاص بك على الفور وأخبره بالمشكلات التي تواجهها مع سيارتك. والخبر السار هو أنه يمكنك الحصول على خدمة مجانية واستبدال قطع غيار إذا كانت السيارة لا تزال تحت الضمان. في هذه الحالة ، سيكون كل من تاجر السيارات والشركة المصنعة مسؤولين عن إصلاح سيارة أودي.

مركز صيانه مرسيدس

مركز صيانه بورش

صيانة اودي

مركز صيانه رنج روفر

مركز صيانه بي ام دبليو

my cemeteries said...

مقابر للبيع و مدافن للبيع
مقابر للبيع ومقابر للبيع من شركة الرحمن الرحيم
شركة الرحمن الرحيم هي واحدة من الشركات الرائدة في مصر مع مجموعة واسعة من المنتجات التي يتم تقديمها. لقد أدخلت للتو منتجًا جديدًا إلى السوق وهو مقابر للبيع ، وتقع جميعها في محافظة القاهرة.
لدينا مقابر للبيع بأسعار معقولة من المؤكد أنها تناسب ميزانيتك. سواء كنت بحاجة إلى مقبرة صغيرة أو كبيرة ، يمكننا توفيرها بدون تكلفة إضافية.