2016-07-20 2 views
2

Eigen에서 희소 행렬의 대각선을 편집하는 가장 빠른 방법은 무엇입니까? 이미 삼중 항을 사용하여 값을 채 웠습니다. 그러나 대각선 값을 모두 변경해야하는 경우가 있습니다 (이미 0이 아닌 값으로 설정되어 있음). 각 액세스 이진 검색을 포함으로희소 행렬의 고유 대각선 업데이트

답변

2

이 허용하는 경우, 당신은 단순히

sp_mat(i, i) 

처럼 자신의 인덱스를 사용할 수, 성능이 만족되지 않을 수 있습니다. 이 경우 몇 가지 제한 사항으로 더 나은 성능을 얻을 수 있습니다.

  1. 행렬의 기본 레이아웃을 변경하지 않습니다. nnzs 추가/삭제, 압축;
  2. 대각선으로 반복적으로 액세스 할 것입니다.

이러한 제한 사항으로 인해 나중에 O (1) 시간대에 데이터에 액세스 할 수 있도록 대각선 구성 요소의 포인터를 저장할 수 있습니다.

sp_mat.diagonal().array() += 1; 

경고 : 당신은 인스턴스가 각각의 대각선 요소에 하나를 추가 할 수 당신은 또한, 밀도 벡터 표현을 통해 대각선을 편집 할 수 있습니다, kangshiyin 응답을 완료하려면

&sp_mat(i, i) 
+0

바로 이러한 것들이 제 조건입니다. 해당 위치에 대한 포인터에 액세스하는 방법을 알고 있습니까? – cgreen

+0

@cgreen use'&' – kangshiyin

2

로 포인터를 얻을 수 있습니다 : 대각 요소가 이미있는 경우에만 작동합니다. 원래 질문의 경우입니다.

+0

내게있어 요소들은 이미 존재할 것이다. 그 표현식이 포인터를 저장하고 직접 변경하는 것보다 더 빠르거나 느릴 것이라고 기대하십니까? – cgreen

+0

이 방법은 매번 바이너리 검색을 필요로하지만, 어떤 경우에는 쓰기가 쉽습니다. – ggael

+0

v3.2.9에서 .diagonal()을 사용할 수 있습니까? – kangshiyin

관련 문제