У меня есть эта матрица A, представляющая сходство интенсивностей пикселей изображения. Например: Рассмотрим изображение 10 x 10
. Матрица А в этом случае будет иметь размерность 100 x 100
, а элемент A (i, j) будет иметь значение в диапазоне от 0 до 1, представляя сходство пикселей i-j по интенсивности.Вычисление собственных векторов с использованием OpenCV
Я использую OpenCV для обработки изображений, а среда разработки - это C на Linux.
Цель состоит в вычислении собственных векторов матрицы А и я использовал следующий подход:
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 является матрицей с плавающей запятой)?
веселит
не использовал ГЦОС/СВД в OpenCV, но это не так, что собственные вернулись должны быть отсортированы? – Amro
Да, это правильно. Я только что вернул верхние 5 собственных значений, и по величине они в порядке (от самого большого до наименьшего). С точки зрения знака это не так. Но знак просто указывает на ориентацию вектора, поэтому я предполагаю, что собственные значения в порядке. Просто беспокоились о собственных векторах. – Arnkrishn
ой забыл про знак! в соответствии с документацией достаточно epsilon 1e-15 (вы используете eps = 1e-300). Может ли это вызвать проблему? Также разве это не правда, что мы обычно можем ожидать, что только некоторые из немногих наибольших собственных векторов объясняют большую часть дисперсии данных? – Amro