2016-06-16 22 views
0

基本上我想找到給定內核/矩陣的排名,以便我可以檢查它是否可分離?使用OpenCV查找內核/矩陣的排名

OpenCV中是否有函數來查找內核的等級?

如果我是正確的,我們可以使用svd類的計算方法找到奇異值,但在那之後我們如何計算等級?以下是我使用的代碼。

double k = 3; 
float kdata[] = {2,0,2,0,1,0,0,0,0}; 
Mat kernel(k,k,CV_32F, kdata); 
Mat s,u,v; 
SVD::compute(kernel,s,u,v); 
+2

矩陣的秩「等於非零奇異值的數量」。請參閱[this](http://stackoverflow.com/a/11548343/3926689)回答。 – Frik

+0

那麼,我如何訪問mat對象的數據或元素,以便可以計算非零奇異值的數量?我應該訪問哪個變量(有問題的代碼發佈)? –

+0

沿's'的對角線使用'mat.at (row,col)'。 's'的對角條目被稱爲矩陣內核的奇異值。 – Frik

回答

0

當我們使用SVD類的計算方法,我們基本上計算矩陣的奇異值分解和奇異值被計算並存儲在第一參數即變量「s」的。

現在要找到矩陣的秩,我們所要做的就是計算變量's'中非零值的數量。

int count = 0; 
for(int i = 0; i < s.rows; i++) 
{ 
    for(int j = 0; j < s.cols; j++) 
    { 
     if(s.at<float>(i,j) != 0) 
     count++; 
    } 
} 
cout<<count<<endl; 

'Count'變量存儲我們的排名。現在如果秩爲1,那麼過濾器是可分離的。如果它超過1,則不可分離。

我想感謝Frik幫助我達到答案。