2014-10-30 4 views
1

Armadillo 라이브러리에서 C++을 사용하고 있습니다.C++ Armadillo : 가장 가까운 이웃

숫자 순서로 정렬 된 nx1 열 행렬이 있다고 가정합니다. 예를 들어

mat X; X.randn(100,1); 
mat X_sorted; X_sorted = sort(X); 
cout << X_sorted << endl; 

과 내가 가진 가정 변수

내가 원하는
double y = 0.5; 

:x_sorted(z)가 Y에 가장 가까운되는 x_sorted의 인덱스, z을, 찾는 방법입니다 . 넥타이 (실제로는 제 경우에는 중요하지 않음)의 경우 더 큰 것을 선택하십시오. 그 일의

답변

1

한 가지 방법은 다음과 같이이다 :

int z = as_scalar(sort_index(abs(X_sorted - y)).row(0)); 

이 솔루션을 비판 주시기 및 개선을 제안하십시오.

여기에 행동에 그것의 예제 프로그램입니다 :

int main(int argc, char** argv) 
{ 
using namespace arma; 
using namespace std; 

mat X; X.randn(100,1); 
mat X2; X2.zeros(100,1); 
for(int i=0; i<100; i++){X2(i) = i;} 
mat X_sorted; X_sorted = sort(X); 

mat XX; XX=join_rows(X2,X_sorted); 
cout << XX << endl; 

double y = 0.5; 
int z = as_scalar(sort_index(abs(X_sorted - y)).row(0)); 
mat XX_z; XX_z = XX.row(z); 
cout << XX_z << endl; 

return 0; 
} 
+1

귀하의 솔루션은 한 줄에있는의 우아함이있다. 그러나 최선의 가능한 점근 시간의 복잡성은 없습니다. 배열에있는 모든 값을 변수와 비교하는 것은 점근 적 시간 복잡성'O (n)'을가집니다. 이진 탐색은 점근 적 시간 복잡성'O (log (n))'을 가질 것이다. – Svaberg

관련 문제