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 件のコメント

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

サインインしてコメントする。

 採用された回答

Doug Hull
Doug Hull 2011 年 8 月 23 日

0 投票

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 件のコメント

Walter Roberson
Walter Roberson 2011 年 8 月 23 日
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 2011 年 8 月 24 日
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.
Daniel Shub
Daniel Shub 2011 年 8 月 24 日
They are shorthand for 'uniform' and false

サインインしてコメントする。

その他の回答 (1 件)

Daniel Shub
Daniel Shub 2011 年 8 月 24 日

0 投票

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

カテゴリ

ヘルプ センター および File ExchangeLoops and Conditional Statements についてさらに検索

質問済み:

2011 年 8 月 23 日

Community Treasure Hunt

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

Start Hunting!

Translated by