Если вам известны размеры вашей матрицы (квадратные или иные), вы можете извлечь любую понравившуюся вам диагональ или даже измененные диагонали (например, числа в (1,1), (2,3), (3,5).) и т. д.), несколько быстрее, чем использование diag, просто используя индексный вызов, подобный следующему:
a=M(1:4:9)
(примечание: это создает вектор строки; для вектора столбца просто транспонировать) Для матрицы NxNпросто начните с нужного значения (1 для верхнего левого угла, 2 для следующего вниз по вертикали и т. д.), затем увеличивайте его на N + 1, пока не достигнете соответствующего значения.
octave:35> tic; for i=1:10000 diag(rand(3)); end; toc;
Elapsed time is 0.13973 seconds.
octave:36> tic; for i=1:10000 rand(3)(1:4:9); end; toc;
Elapsed time is 0.10966 seconds.
Для справки:
octave:49> tic; for i=1:10000 rand(3); end; toc;
Elapsed time is 0.082429 seconds.
octave:107> version
ans = 3.6.3
Таким образом, накладные расходы для цикла for и функции rand, вычтенные off, показывают, что использование индексов примерно в два раза быстрее, чем использование diag.Я подозреваю, что это происходит из-за накладных расходов на вызов diag, так как сама операция очень проста и быстра, и почти наверняка так работает сама diag.