這個問題可能聽起來有點奇怪:我想用Boost的ublas和ATLAS/Lapack做數字矩陣計算。我正在使用Boost numeric bindings來連接這兩個庫。但是,我無法找到它,或者沒有關於如何使用這些綁定的適當文檔。另外,我是Boost的新手(實際上是C++),所以我很難找到如何在代碼中使用Lapack提供的函數。如何閱讀C++代碼或:如何在沒有文檔的情況下執行操作?
我最終想解決的問題是找到對稱帶狀矩陣的特徵值和 - 向量。據我瞭解,我會爲此使用lapack::steqr
。事情是,我不知道,如何正確調用函數。在數字綁定的代碼中,我可以看到類似這樣的內容:
template <typename D, typename E, typename Z, typename W>
inline
int steqr(char compz, D& d, E& e, Z& z, W& work) {
int const n = traits::vector_size (d);
assert(traits::vector_size (e) == n-1);
assert(traits::matrix_size1 (z) == n);
assert(traits::matrix_size2 (z) == n);
assert(compz=='N' || compz=='V' || compz=='I');
...
現在,我該如何處理?我嘗試了steqr<double, double, double, double>(...)
和雙數組,但沒有成功。然後,爲了找到合適的參數,我選擇了一個斷言,並試圖找到任何與traits::matrix_size1(...)
一起工作的東西 - 即使我無法編譯,也不能使用雙數組,也不能使用ublas::matrix
。
所以我的問題是,一般來說:當我找到沒有完整文檔的這樣一個庫時,我該如何找出如何調用函數?我主要來自C,對所有這些模板都非常困惑。唯一的方法是真正追蹤代碼中的所有內容嗎?還是有小動作?或者我可能可以從錯誤消息中獲取信息?這樣的錯誤消息的
一個例子是,對於下面的代碼:
ublas::matrix<double> empty(N,N);
std::cout << traits::matrix_size1<ublas::matrix>(empty) << std::endl;
然後我在編譯過程中得到:
eigenvalues.cpp:40:85: error: no matching function for call to ‘matrix_size1(boost::numeric::ublas::matrix<double, boost::numeric::ublas::basic_row_major<>, boost::numeric::ublas::unbounded_array<double, std::allocator<double> > >&)’
eigenvalues.cpp:40:85: note: candidate is:
/usr/include/boost/numeric/bindings/traits/matrix_traits.hpp:148:18: note: template<class M> std::ptrdiff_t boost::numeric::bindings::traits::matrix_size1(M&)
這可能是有用的,該候選人列在其中,但我只是不知道,如何閱讀這一行,並相應地調整我的代碼。
同樣:這個問題有點更一般,就如何處理這樣的東西。我知道類和模板的基本概念,但就我的知識而言,這太抽象了。
通常,當函數參數類型可以從函數參數中推導出來時,不需要爲函數明確指定模板參數。這意味着,例如,您可以將'matrix_size1'作爲'matrix_size1(空)'調用。你原來的代碼不能編譯的原因是你傳遞一個模板('ublas :: matrix')作爲模板參數,而不是一個類(在這種情況下,正確的類型是'ublas :: matrix')。 –
Mankarse
至於你的原始問題 - 唯一的方法就是具有豐富的語言經驗,並應用一些關於參數類型的靈感猜測。另一種方法可能是簡單地避免記錄不完善的庫。 – Mankarse
儘管我主要是因爲嘗試運氣的緣故,但我確實弄明白了。此外,有什麼幫助很多,是與庫來了一個測試/目錄,所有功能都經過測試,提供了一個示例實現。 – janoliver