breeze 复制下三角不起作用?

breeze Copy lower triangle not working?

使用 breeze 0.13,Scala 2.12.3

我想通过将下面的三角形复制到上面的三角形来创建一个对称矩阵。按照 Linear Algebra Cheat Sheet 中的说明进行操作。可能是我错误地使用了该函数,但 lowerTriangular 函数似乎无法正常工作。副本只是

val myMtx = breeze.linalg.DenseMatrix((1,-8,-9) , (2,1,-7), (3,5,1))
//myMtx: breeze.linalg.DenseMatrix[Int] = 
//  1  -8  -9
//  2   1  -7
//  3   5   1

复制下三角(似乎不起作用)

breeze.linalg.lowerTriangular(myMtx)
//  1  0  0
//  2  1  0
//  3  5  1

复制上三角(也不起作用)

breeze.linalg.upperTriangular(myMtx)
//  1  -8  -9
//  0   1  -7
//  0   0   1

在此上下文中,"copy" 表示 returns 新分配内存中的矩阵。这与索引到相同后备内存的 "view" 形成对比。

考虑到这一点,lowerTriangular 和 upperTriangular 似乎都可以正常工作,因为它 returns 一个新矩阵,它具有从原始矩阵复制的相同元素。

现在的任务是创建一个新的对称矩阵,它是下三角的副本。一种可能的方法是计算下对角线转置和下对角线转置的逐元素总和,然后减去计算出的对角线的额外副本。如上所述,内部 diag() returns 一个视图作为向量,然后使用该向量与第二个 diag() 创建对角矩阵。

@ val sym = lowerTriangular(myMtx) + lowerTriangular(myMtx).t - diag(diag(myMtx)) 
sym: DenseMatrix[Int] = 
1  2  3  
2  1  5  
3  5  1