2012-04-22 2 views
1

Armadillo 행렬 라이브러리를 사용하여 2 차원 행렬의 열에 액세스하는 효율적인 방법은 .col (i)를 호출하는 것입니다.Armadillo C++ : 큐브 구조의 열 효율적인 액세스

"slice"명령을 호출 할 필요없이 "큐브"에 저장된 열을 추출하는 효율적인 방법이 있습니까?

예를 들어 (matlab 표기법을 사용하여) A (:, i, j)에 저장된 데이터에 액세스하는 가장 효율적인 방법이 필요합니다. 매우 큰 데이터 세트에서이 수백만 번을 수행하게 될 것이므로 속도와 효율성이 최우선 과제입니다.

답변

2

난 당신이

B = A.subcube(span:all, span(i), span(j)); 

또는 싶은 생각 동등 B (예 : 기본적으로 double를 포함, 또는 숫자의 A 같은 유형의 행 또는 열 벡터가 될 것

B = A.subcube(span(), span(i), span(j)); 

다른 사용 가능한 유형).

+0

매트를 반환한다고 생각합니다. 이상적으로는 vec가 반환되어야합니다. – oracle3001

+0

죄송합니다. 조심스럽지 않고 시험하지 않았습니다. 이것은 vec를 반환 할 것이고, 나는 이것을 많이 사용했다. 단 하나의 열로 축소되므로 행렬은 실제로 행 또는 열 벡터가됩니다. 나는 내 대답을 편집했다. –

+0

감사합니다. 나는 그것을 시도해 볼 것입니다. – oracle3001

0

.slice()가 매우 빠릅니다. 기본 Mat 클래스에 대한 참조를 제공하기 만하면됩니다. 이러한 라인을 따라 뭔가를 시도 할 수 :

또한
cube C(4,3,2); 
double* mem = C.slice(1).colptr(2); 

, 아르마딜로는 기본적으로 사용 검사 범위가 마음에 곰. 당신이 .at() 요소 접근 사용 범위 검사를 피하고 싶은 경우 또는

cube C(4,3,2); 
C.at(3,2,1) = 456; 

을, 당신은 필드 클래스에 행렬을 저장할 수 있습니다 :

field<mat> F(100); 
F(0).ones(12,34); 

해당 요소 액세스 :

F(0)(1,2);  // with range checks 
F.at(0).at(1,2); // without range checks 

범위 검사와 같은 모든 런타임 디버깅을 제거하는 ARMA_NO_DEBUG를 정의하여 코드를 컴파일 할 수도 있습니다. 이렇게하면 속도는 향상되지만 모든 코드를 디버깅 (즉 알고리즘이 올바르게 작동하는지 확인) 한 후에 만 ​​권장됩니다. 디버깅 검사는 실수를 선택하는 데 매우 유용합니다.

관련 문제