2013-06-17 2 views
1

행렬의 범위에 대한 정규직 기준을 계산하는 방법을 찾아야합니다. matlab에 this function 않습니다.비 정사각형 (직사각형) 행렬의 정규직 기준을 계산하는 방법

내가 C/C++에서이 작업을 수행 할 필요가 내가 실제로 그러나 OpenCV

함께 일하고, 나는 OpenCV의에서이 기능을 제공 아무것도 발견하지 않았습니다.

cvSVD로 작업을 시도했지만 결과가 정확하지 않습니다.

실마리가 있습니까?

+0

에있어서, m> N만큼 직사각형 행렬 작동 옥타브 시도 대신 : HTTP : //www.delorie.com/gnu/docs/octave/octave_144.html – Magn3s1um

+0

충분히 명확하지 않은 질문을 편집했습니다. 나는 OpenCV가 알고리즘을 가지고 있다고 생각하지 않지만 SFC가 그 일을하지는 않지만 그램 - 슈미트 (Gram-Schmidt) 알고리즘은 어떻게 될 것인가에 대해서는 – dwbrito

+1

에서 이것을하고있다. –

답변

2

이며 this paper

- (CvMat *) buildOrthonormal:(CvMat *) matrix { 

    NSInteger rows = matrix->rows; 
    NSInteger cols = matrix->cols; 

    CvMat *Q = cvCreateMat(rows, cols, kMatrixType); 
    CvMat *R = cvCreateMat(cols, cols, kMatrixType); 

    for (NSInteger k = 0; k < cols; k++) { 
     cvSetReal2D(R, k, k, 0.0f); 

     for (NSInteger i = 0; i < rows; i++) { 
      double value = cvGetReal2D(R, k, k) + cvGetReal2D(matrix, i, k) * cvGetReal2D(matrix, i, k); 
      cvSetReal2D(R, k, k, value); 
     } 
     cvSetReal2D(R, k, k, sqrt(cvGetReal2D(R, k, k)));  

     for (NSInteger i = 0; i < rows; i++) { 
      double value = cvGetReal2D(matrix, i, k)/cvGetReal2D(R, k, k); 
      cvSetReal2D(Q, i, k, value); 
     } 

     for (NSInteger j = k + 1; j < cols; j++) { 
      cvSetReal2D(R, k, j, 0.0f); 
      for (NSInteger i = 0; i < rows; i++) { 
       double value = cvGetReal2D(R, k, j) + cvGetReal2D(Q, i, k) * cvGetReal2D(matrix, i, j); 
       cvSetReal2D(R, k, j, value); 
      } 

      for (NSInteger i = 0; i < rows; i++) { 
       double value = cvGetReal2D(matrix, i, j) - cvGetReal2D(R, k, j) * cvGetReal2D(Q, i, k); 
       cvSetReal2D(matrix, i, j, value); 
      } 
     } 
    } 
    cvReleaseMat(&R); 

    return Q; 
} 
1

당신은 BLAS 라이브러리 상단에 훌륭하고 잘 검증 된 라이브러리 건물 인 Gnu Scientific Library을 조사하고 싶습니다. 그것은 다른 행렬 연산을 많이 구현하며 일반적으로 선형 대수학을 시작할 것입니다. 아마 these 중 하나가 당신에게 어울리나요?

5

위의 @PureW는이 문제를 해결하기 위해 기존 툴킷/라이브러리가 필요한 경우 유효한 대답을 제공합니다. 이 함수를 직접 구현해야하는 경우 Gram-Schmidt 알고리즘을 구현할 수 있습니다. 여기

당신이 당신의 코드를 확인할 수 있도록 예제 문제 : 여기

http://www.mia.uni-saarland.de/Teaching/NAVC-SS11/sol_c8.pdf

그리고

코드입니다 (전체 크레딧에 대한 참조를 참조하십시오). 제발 참고 :이 예제는 당신이 적당히 확장됩니다 데이터 세트를 가지고 있다고 가정합니다. 축척이 잘못 조정 된 경우 LU 분해 또는 해당 피벗 전략을 고려해야 할 수 있습니다. 참고 문헌의이 주제에 대한 유용한 링크가 있습니다.

#include <cstdlib> 
#include <iostream> 
#include <math.h> 
using namespace std; 

// example: http://www.mia.uni-saarland.de/Teaching/NAVC-SS11/sol_c8.pdf 
// page 5 

double a[3][3] = { 
    {1.0, 2.0, 1.0}, 
    {0.0, 1.0, 2.0}, 
    {1.0, 2.0, 0.0} 
}; 
// any column of a is a vector 

double r[3][3], q[3][3]; 

int main(int argc, char *argv[]) { 
    int k, i, j; 
    for (k=0; k<3; k++){ 
     r[k][k]=0; // equivalent to sum = 0 
     for (i=0; i<3; i++) 
     r[k][k] = r[k][k] + a[i][k] * a[i][k]; // rkk = sqr(a0k) + sqr(a1k) + sqr(a2k) 
     r[k][k] = sqrt(r[k][k]); // ||a|| 
     cout << endl << "R"<<k<<k<<": " << r[k][k]; 

     for (i=0; i<3; i++) { 
      q[i][k] = a[i][k]/r[k][k]; 
      cout << " q"<<i<<k<<": "<<q[i][k] << " "; 
     } 

     for(j=k+1; j<3; j++) { 
     r[k][j]=0; 
     for(i=0; i<3; i++) r[k][j] += q[i][k] * a[i][j]; 
     cout << endl << "r"<<k<<j<<": " <<r[k][j] <<endl; 

     for (i=0; i<3; i++) a[i][j] = a[i][j] - r[k][j]*q[i][k]; 

     for (i=0; i<3; i++) cout << "a"<<j<<": " << a[i][j]<< " "; 
     } 
} 

    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 

참고 :


  1. http://www.cplusplus.com/forum/general/88888/
  2. http://www.mia.uni-saarland.de/Teaching/NAVC-SS11/sol_c8.pdf
  3. http://en.wikipedia.org/wiki/Pivot_element
  4. http://math.fullerton.edu/mathews/n2003/PivotingMod.html
  5. http://www.mathworks.com/support/solutions/en/data/1-FA9A48/index.html?solution=1-FA9A48
+0

입력 행렬이 정사각형이 아니거나 '3'이 '행'과 '열'로 사용 되었다면이 예제가 더 이해하기 쉬울 것이라고 생각합니다. – dwbrito

+0

사실,하지만 이것은 이미 다른 사람의 코드라고 인정했습니다. 참조 섹션. 또한 다른 행렬 크기를 수용하는 코드를 변경하는 것이 매우 쉽습니다. 마지막으로, 일반적인 알고리즘 자체가 제시되었는데, 이는 대부분의 작업입니다. – DevNull

+0

확실히, 나는 그것을 이해했다. 그럼에도 불구하고, 나는 어떤 종류의 행렬에서도 작동하는 버전이 필요하다. 여전히 그것을 구현하려고합니다. – dwbrito

0

Matlab은 코드를 생성 할 수 있습니다. 왜 해보지 않으시겠습니까 ??? 우선 그것을 사용 마지막 검사하고 생성, 즉 이것은 OpenCV의 인 모든