Я думаю, что вы ищете это: вы делаете (разреженный) блочно-диагональную матрицу A
:
A = [a1 0 0 ...
0 a2 0 ...
0 0 a3 ...
: : : \ ]
с ai
для 1 < i < 200,000
«номер страницы» из исходного массива (третье измерение) , Вы можете сделать это, используя spdiags()
. Тогда собственные значения A
являются собственными значениями исходных матриц.
Однако, существует несколько проблем с этим подходом. Связь между собственными значениями и матрицей ai
, к которой они относятся, трудно восстановить после использования eig(s)
. Плюс, я думаю, что это полный перебор, а не быстрее, чем цикл, потому что ваши подматрицы настолько малы.
Поскольку все они 2 × 2, их characteristic equations являются квадратными и чрезвычайно простыми в решении. Так почему бы не сделать это вручную:
% Compute the necessary factors
a = 1;
b = -H(1,1,:) - H(2,2,:);
c = H(1,1,:) .* H(2,2,:) - H(1,2,:) .* H(2,1,:);
% to be used in the quadratic formula:
lambda1 = (-b + sqrt(b.^2 - 4*a*c)) /2/a;
lambda2 = (-b - sqrt(b.^2 - 4*a*c)) /2/a;
с H
оригинал 3D массив. Так как a = 1
, это упрощает для
sqdiscr = sqrt(b.*b - 4*c);
lambda1 = -b + sqdiscr;
lambda2 = -b - sqdiscr;
вам нужно кольцую для каждого из 200000 единиц, кстати, это не будет быстро без параллельных вычислений инструментов. – GameOfThrows
Да, вот почему я хочу сделать это без циклов. Позвольте мне задать вопрос, пожалуйста. – Navdeep
Как я уже сказал, вам понадобится параллельная вычислительная техника, чтобы ускорить ее, или она будет очень медленной. – GameOfThrows