假设矩阵M
:
1 2 3
3 5 6
6 8 9
如何存储我从中提取以下行向量a
?
1
5
9
答案 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本身是如何工作的。