2011-12-10 17 views
2

這個問題可能聽起來有點奇怪:我想用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&) 

這可能是有用的,該候選人列在其中,但我只是不知道,如何閱讀這一行,並相應地調整我的代碼。

同樣:這個問題有點更一般,就如何處理這樣的東西。我知道類和模板的基本概念,但就我的知識而言,這太抽象了。

+0

通常,當函數參數類型可以從函數參數中推導出來時,不需要爲函數明確指定模板參數。這意味着,例如,您可以將'matrix_size1'作爲'matrix_size1(空)'調用。你原來的代碼不能編譯的原因是你傳遞一個模板('ublas :: matrix')作爲模板參數,而不是一個類(在這種情況下,正確的類型是'ublas :: matrix ')。 – Mankarse

+0

至於你的原始問題 - 唯一的方法就是具有豐富的語言經驗,並應用一些關於參數類型的靈感猜測。另一種方法可能是簡單地避免記錄不完善的庫。 – Mankarse

+0

儘管我主要是因爲嘗試運氣的緣故,但我確實弄明白了。此外,有什麼幫助很多,是與庫來了一個測試/目錄,所有功能都經過測試,提供了一個示例實現。 – janoliver

回答

1

由於我對模板化C++不太熟練,因此我個人發現使用cblas接口更容易,該接口只是原始Fortran代碼的薄包裝。

在這種方法中,您必須爲矩陣創建自己的類,這與Fortran對矩陣的理解是兼容的。最簡單的方法可能是從std::vectorstd::valarray繼承並提供您自己的索引操作。 是的,這是一個工作。但它沒有聽起來那麼糟糕:-)。

順便提一句,請謹慎使用具有雙精度參數的單精度例程(ssteqr)。 LAPACK不會報告任何錯誤,但結果將是錯誤的。

+0

感謝您的評論。我實際上使用雙精度,但我希望升壓數字綁定選擇正確的算法來滿足我的需求。我的意思是,這部分是他們的目的,對吧?我會在某種程度上將我的結果與分析結果進行比較,所以我會看到它是否正確。然而,正如我所說,我想出瞭如何使用這些東西,我會在稍後發佈它。 – janoliver

相關問題