Это в OpenCV, и он работает с прямоугольной матрицей, пока т> п, согласно 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;
}
Попробуйте октаву вместо: HTTP: //www.delorie.com/gnu/docs/octave/octave_144.html – Magn3s1um
Я отредактировал вопрос, если он не был достаточно явным. Я делаю это в c – dwbrito
SVD не будет этого делать, но алгоритм Грэма-Шмидта будет делать, хотя я не думаю, что OpenCV имеет алгоритм. –