2017-02-05 94 views
0

隨着徵:給定一個大的稀疏矩陣,這將是決定如果在給定位置的值是空或不是最快的方法是什麼?稀疏矩陣:確定值是否爲空的最快方法?

必須說我用這個稀疏矩陣實現來存儲非數字值。這與this question有關。

目前,我有什麼是(與T我的數據類型):

Eigen::SparseMatrix<T> mat(n,n); // n could be 1000, 10000, ... 

// fill 
T e1(/* some values */); 
mat.insert(3, 4) = e1; 
... 

檢查與完成:

T elem = mat.coeff(row, col); 
if(elem == T()) // use default constructor 
    std::cout << "empty !\n"; 

但這並不能滿足我,因爲這意味着兩一個複製操作和一個深度比較操作符。我想可能是這樣的:

if(mat.isNull(row, col)) 
    std::cout << "empty !\n"; 

有沒有辦法我可以做到這一點?或者獲取一個返回nullptr如果爲空的指針? 我檢查Tutorial pagesquick refrelevant manual pages,但沒有發現任何東西。

如果這似乎是不可能的,那麼我想與地圖保存所有滿倉沿着一類加以包裝。這樣我就可以快速找出給定的行,col是否有值。

附錄:我有徵3.2,但如果需要可以切換到3.3。

編輯:鏈接的問題詢問如何獲取一組非空元素。我所要求的是「我怎麼知道(row,col)的值是否爲空?」。不是傻瓜AFAIK。

+0

的可能的複製[艾根稀疏矩陣得到非零元素的指數(http://stackoverflow.com/questions/28854640/eigen-sparse-matrix-get-indices-of-nonzero-elements) – timrau

+0

@timrau真的嗎?請你再讀一遍另一個問題,重新考慮你的國旗。我**不**問如何獲得一組非空值,但如何知道給定的(行,列)位置是否保持空值。 – kebs

+0

我之前評論中的代碼片段錯誤。 – timrau

回答

1

https://eigen.tuxfamily.org/dox-devel/group__TutorialSparse.html派生,你可以定義空校驗功能一樣

bool isNull(const Eigen::SparseMatrix<T>& mat, int row, int col) 
{ 
    for (Eigen::SparseMatrix<T>::InnerIterator it(mat, col); it; ++it) { 
     if (it.row() == row) return false; 
    } 
    return true; 
} 

這樣你就不會複製任何東西。你也不要進行深度比較。

+0

感謝您的回答。是的,這可能是唯一不需要存儲索引的解決方案。我可能不得不檢查哪一個是最快的,因爲它仍然可以保持很多值。 – kebs