J'ai cette matrice A, représentant les similitudes des intensités de pixels d'une image. Par exemple: Considérez une image 10 x 10
. La matrice A dans ce cas serait de dimension 100 x 100
, et l'élément A (i, j) aurait une valeur dans l'intervalle de 0 à 1, représentant la similarité des pixels i à j en termes d'intensité. J'utilise OpenCV pour le traitement d'image et l'environnement de développement est C sous Linux.Calcul du vecteur propre en utilisant OpenCV
L'objectif est de calculer les vecteurs propres de la matrice A et je l'ai utilisé l'approche suivante:
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
}
}
Problème: Après l'exécution je reçois presque tous les composants de tous les vecteurs propres à zéro. J'ai essayé différentes images et j'ai aussi essayé de peupler A avec des valeurs aléatoires entre 0 et 1, mais le même résultat.
Peu de valeurs propres haut retournés se présenter comme suit:
9805401476911479666115491135488.000000
-9805401476911479666115491135488.000000
-89222871725331592641813413888.000000
89222862280598626902522986496.000000
5255391142666987110400.000000
Je pense maintenant sur les lignes de l'utilisation cvSVD() qui effectue la décomposition en valeurs singulières de la matrice réelle à virgule flottante et pourrait me donner les vecteurs propres. Mais avant cela, j'ai pensé à le demander ici. Y a-t-il quelque chose d'absurde dans mon approche actuelle? Est-ce que j'utilise la bonne API, c'est-à-dire cvEigenVV() pour la bonne matrice d'entrée (ma matrice A est une matrice à virgule flottante)?
acclamations
ont pas vraiment utilisé EIG/SVD dans OpenCV, mais est-il vrai que les valeurs propres revenus doivent être triés? – Amro
Oui, c'est correct. Je viens de mettre en place les 5 valeurs propres les plus élevées retournées et en termes de magnitude, elles sont dans l'ordre (du plus grand au plus petit). En termes de signe, ils ne le sont pas. Mais le signe indique simplement l'orientation du vecteur, donc je présume que les valeurs propres sont correctes. Juste préoccupé par les vecteurs propres. – Arnkrishn
oh oublié le signe! bien selon la documentation, une valeur epsilon de 1e-15 est suffisante (vous utilisez eps = 1e-300). Cela pourrait-il causer le problème? En outre, n'est-il pas vrai que nous pouvons généralement nous attendre à ce que seuls les premiers vecteurs propres les plus importants représentent une grande partie de la variance des données? – Amro