Как извлечь диагональ в вектор столбца? - PullRequest
1 голос
/ 22 ноября 2011

Предположим матрицу M:

1 2 3
3 5 6
6 8 9

Как хранить, я извлекаю из него следующий вектор строки a?

1
5
9

Ответы [ 2 ]

5 голосов
/ 22 ноября 2011

Вам просто нужно использовать diag :

octave-3.4.0:1> A = [ 1 2 3; 3 5 6; 6 8 9 ]
A =

   1   2   3
   3   5   6
   6   8   9

octave-3.4.0:2> D = diag(A)
D =

   1
   5
   9

Обратите внимание, что вы также можете извлечь другие диагонали, передав второй параметр в diag, например

octave-3.4.0:3> D = diag(A, 1)
D =

   2
   6

octave-3.4.0:4> D = diag(A, -1)
D =

   3
   8
1 голос
/ 16 марта 2013

Если вам известны размеры вашей матрицы (квадратные или иные), вы можете извлечь любую понравившуюся вам диагональ или даже измененные диагонали (например, числа в (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.

...