A lot of eigenvalues

Hello everybody!
I have many 3x3 matrixes (e.g. 3 000 000 matrixes) and I need to compute their eigenvalues. Nowadays, I'm doing it in loop having 3 000 000 counts, but this way is very time consuming. I'd like to know if there is any possibility how to replace the loop by some matrix operation. For example, I can make a 3x3x3000000 matrix from which I would get the eigenvalues, somehow?
Can anybody help with this?
Thank you in advance,
Tom

1 Comment

c(1:3e6) = {rand(3)};
tic
egv = cellfun(@eig,c,'un',0);
toc
23 seconds to me it seems fair.

Sign in to comment.

 Accepted Answer

Doug Hull
Doug Hull on 23 Aug 2011
This from Oleg seems like an answer, not a comment. I prefer to see questions in the 'answered' state.
c(1:3e6) = {rand(3)};
tic
egv = cellfun(@eig,c,'un',0);
toc
23 seconds to me it seems fair.

3 Comments

That creates one random 3x3 matrix and finds its eigenvalues 3000000 times.
c = arrayfun(@(IDX) {rand(3)}, 1:3E6);
tic
egv = cellfun(@eig,c,'un',0);
toc
takes significantly longer on my system (35 seconds).
tomas
tomas on 24 Aug 2011
Olegs answer works. Although I don't understand last two input parameters of cellfun function - 'un',0. Can you tell me what they mean, please?
Thank you guys.
They are shorthand for 'uniform' and false

Sign in to comment.

More Answers (1)

While the loop is ~20% slower on my machine then using cellfun, the answer is in a double array and not a cell array. There may be hidden costs of getting the information from the cell array into a usable form.
N = 3e6;
x = rand(3, 3, N);
tic
egv = zeros(3, N);
for ii = 1:N
egv(:, ii) = eig(x(:, :, ii));
end
toc

Categories

Find more on Loops and Conditional Statements in Help Center and File Exchange

Asked:

on 23 Aug 2011

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!