У меня есть эта матрица A, представляющая сходство интенсивностей пикселей изображения. Например: Рассмотрим образ 10 x 10
. Матрица А в этом случае будет иметь размерность 100 x 100
, а элемент A (i, j) будет иметь значение в диапазоне от 0 до 1, представляя подобие пикселя i-j по интенсивности.
Я использую OpenCV для обработки изображений, а среда разработки - C на Linux.
Цель состоит в том, чтобы вычислить собственные векторы матрицы A, и я использовал следующий подход:
static CvMat mat, *eigenVec, *eigenVal;
static double A[100][100]={}, Ain1D[10000]={};
int cnt=0;
//Converting matrix A into a one dimensional array
//Reason: That is how cvMat requires it
for(i = 0;i < affnDim;i++){
for(j = 0;j < affnDim;j++){
Ain1D[cnt++] = A[i][j];
}
}
mat = cvMat(100, 100, CV_32FC1, Ain1D);
cvEigenVV(&mat, eigenVec, eigenVal, 1e-300);
for(i=0;i < 100;i++){
val1 = cvmGet(eigenVal,i,0); //Fetching Eigen Value
for(j=0;j < 100;j++){
matX[i][j] = cvmGet(eigenVec,i,j); //Fetching each component of Eigenvector i
}
}
Проблема: После выполнения я получаю почти все компоненты всех собственных векторов равными нулю. Я пробовал разные изображения, а также пытался заселить А со случайными значениями от 0 до 1, но тот же результат.
Немногие верные исходные значения выглядят следующим образом:
9805401476911479666115491135488.000000
-9805401476911479666115491135488.000000
-89222871725331592641813413888.000000
89222862280598626902522986496.000000
5255391142666987110400.000000
Теперь я размышляю о том, как использовать cvSVD(), который выполняет декомпозицию по разным значениям реальной матрицы с плавающей запятой и может дать мне собственные векторы. Но до этого я подумал спросить об этом здесь. Есть ли что-то абсурдное в моем нынешнем подходе? Я использую правый API, т.е. cvEigenVV() для правильной матрицы ввода (моя матрица A является матрицей с плавающей запятой)?
веселит