У меня есть эта матрица A, представляющая сходство интенсивностей пикселей изображения. Например: Рассмотрим изображение 10 x 10
. Матрица A в этом случае будет иметь размерность 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
}
}
Проблема: после выполнения почти все компоненты всех собственных векторов равны нулю. Я пробовал разные изображения, а также пытался заполнить A случайными значениями от 0 до 1, но тот же результат.
Некоторые из возвращенных верхних собственных значений выглядят следующим образом:
9805401476911479666115491135488.000000
-9805401476911479666115491135488.000000
-89222871725331592641813413888.000000
89222862280598626902522986496.000000
5255391142666987110400.000000
Сейчас я думаю о том, как использовать cvSVD(), который выполняет разложение по сингулярным числам реальной матрицы с плавающей запятой и может дать мне собственные векторы. Но перед этим думал спросить здесь. Есть ли что-то абсурдное в моем нынешнем подходе? Использую ли я правильный API, т.е. () для правильной входной матрицы (моя матрица A является матрицей с плавающей запятой)?
ваше здоровье