如何将对角线提取到列向量中?

时间:2011-11-22 17:16:49

标签: matrix octave

假设矩阵M

1 2 3
3 5 6
6 8 9

如何存储我从中提取以下行向量a

1
5
9

2 个答案:

答案 0 :(得分:5)

您只需使用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 :(得分:1)

如果你知道矩阵的尺寸(正方形或其他),你可以提取你喜欢的任何对角线,甚至修改对角线(例如(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函数的开销表明使用索引的速度大约是使用diag的两倍。我怀疑这完全是由于调用diag的开销,因为操作本身非常简单快速,并且几乎可以肯定diag本身是如何工作的。