2017-12-14 11 views
0

breeze 0.13, 스칼라 2.12.3 사용breeze 낮은 삼각형을 복사 할 수 없습니까?

아래 삼각형을 위쪽으로 복사하여 대칭 행렬을 만들고 싶습니다. 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는 원래 행렬에서 복사 된 것과 동일한 요소가있는 새 행렬을 반환한다는 점에서 제대로 작동하는 것처럼 보입니다.

이제는 작업이 새로운 삼각형의 복사본 인 대칭 행렬을 새로 만듭니다. 한 가지 가능한 방법은 아래쪽 및 아래쪽 대각 조바꿈의 요소 별 합계를 계산 한 다음 계산 된 대각선의 여분 복사본을 뺍니다. 내부 diag()는 위에서 설명한대로 뷰를 벡터로 반환하고 그 벡터를 사용하여 두 번째 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