행렬의 범위에 대한 정규직 기준을 계산하는 방법을 찾아야합니다. matlab에 this function 않습니다.비 정사각형 (직사각형) 행렬의 정규직 기준을 계산하는 방법
내가 C/C++에서이 작업을 수행 할 필요가 내가 실제로 그러나 OpenCV
함께 일하고, 나는 OpenCV의에서이 기능을 제공 아무것도 발견하지 않았습니다.
cvSVD로 작업을 시도했지만 결과가 정확하지 않습니다.
실마리가 있습니까?
행렬의 범위에 대한 정규직 기준을 계산하는 방법을 찾아야합니다. matlab에 this function 않습니다.비 정사각형 (직사각형) 행렬의 정규직 기준을 계산하는 방법
내가 C/C++에서이 작업을 수행 할 필요가 내가 실제로 그러나 OpenCV
함께 일하고, 나는 OpenCV의에서이 기능을 제공 아무것도 발견하지 않았습니다.
cvSVD로 작업을 시도했지만 결과가 정확하지 않습니다.
실마리가 있습니까?
이며 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;
}
당신은 BLAS 라이브러리 상단에 훌륭하고 잘 검증 된 라이브러리 건물 인 Gnu Scientific Library을 조사하고 싶습니다. 그것은 다른 행렬 연산을 많이 구현하며 일반적으로 선형 대수학을 시작할 것입니다. 아마 these 중 하나가 당신에게 어울리나요?
위의 @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;
}
참고 :
입력 행렬이 정사각형이 아니거나 '3'이 '행'과 '열'로 사용 되었다면이 예제가 더 이해하기 쉬울 것이라고 생각합니다. – dwbrito
사실,하지만 이것은 이미 다른 사람의 코드라고 인정했습니다. 참조 섹션. 또한 다른 행렬 크기를 수용하는 코드를 변경하는 것이 매우 쉽습니다. 마지막으로, 일반적인 알고리즘 자체가 제시되었는데, 이는 대부분의 작업입니다. – DevNull
확실히, 나는 그것을 이해했다. 그럼에도 불구하고, 나는 어떤 종류의 행렬에서도 작동하는 버전이 필요하다. 여전히 그것을 구현하려고합니다. – dwbrito
Matlab은 코드를 생성 할 수 있습니다. 왜 해보지 않으시겠습니까 ??? 우선 그것을 사용 마지막 검사하고 생성, 즉 이것은 OpenCV의 인 모든
에있어서, m> N만큼 직사각형 행렬 작동 옥타브 시도 대신 : HTTP : //www.delorie.com/gnu/docs/octave/octave_144.html – Magn3s1um
충분히 명확하지 않은 질문을 편집했습니다. 나는 OpenCV가 알고리즘을 가지고 있다고 생각하지 않지만 SFC가 그 일을하지는 않지만 그램 - 슈미트 (Gram-Schmidt) 알고리즘은 어떻게 될 것인가에 대해서는 – dwbrito
에서 이것을하고있다. –