2017-12-14 6 views
0

breezeを使用する0.13、Scala 2.12.3breeze下三角をコピーできませんか?

下の三角形を上の方にコピーして対称行列を作成したいと思います。 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 

答えて

0

、 "コピー" を返す意味します新しい割り当てられたメモリ内の行列。これは、同じバッキングメモリにインデックスを付ける「ビュー」とは対照的です。

これを念頭において、lowerTriangularとupperTriangularの両方が、元の行列からコピーされた同じ要素を持つ新しい行列を返すという点で正しく動作しているようです。

タスクは、下三角のコピーである新しい対称マトリックスを作成するようになりました。 1つの可能な方法は、下位および下位の対角転置の要素ごとの合計を計算し、次に計算された対角の余分なコピーを減算することです。内部diag()は、上記のようにビューをベクトルとして返し、そのベクトルを使って第2のdiag()を持つ対角行列を作成します。

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

lowerTriangularとupperTriangularの定義を明確にしてくれてありがとう。非常に「diag(diag(myMtx))」のトリックと同様に、 – Polymerase

関連する問題