[英]High-performance C++ multi-dimensional arrays
Eigen維護得非常好(至少現在每個月都會推出新版本)並支持您需要的其他操作。
這里有一個廣泛且相對較新的調查,包括基准。
我相信您可以通過將 Boost.UBlas 綁定到 LAPACK 或 Intel MKL 等基礎數值庫來加速它,但還沒有這樣做。
fwiw,似乎最常作為候選者出現的實現是 Boost.UBlas 和 MTL。 根據我的經驗,廣泛采用更有可能促進持續的支持和發展。
Necomi似乎提供了您想要的功能。
它包括對任意多維數的支持,其維度可以在運行時固定,提供對單個元素的快速訪問,同時還支持算術(以及其他)表達式。
又是一個無恥的自吹自擂,
https://github.com/dwwork/FortCpp/
我已經在 GitHub 上發布了我自己對這個問題的個人解決方案。 無論如何,我都不是 C++ 專家,但我想我至少會把它扔在那里。
也許你想試試我的“Multi”庫: https ://gitlab.com/correaa/boost-multi
multi::array<int, 2> A({m, n});
A[i][j] += 42;
生成類似於A.base() + i*stride_1 + j*stride_2
的機器代碼。 https://gitlab.com/correaa/boost-multi#whats-up-with-the-multiple-bracket-notation
array1 = array2 + 2 * array3
好吧,不是那樣,我決定將數組算術與數據結構分開。
話雖如此,該庫與 STL 算法非常兼容(如果您的步伐允許,它有一個使用 BLAS 的適配器)。
過度簡化有關訪問模式的一些問題,...
template<class T, class X, class Y>
auto axpy(T alpha, X const& x, Y&& y) -> Y&& {
assert( extensions(x) == extensions(y) );
std::transform(
x.elements().begin(), x.elements().end(),
y.elements().begin(),
y.elements().begin(),
[&](auto const& ex, auto& ey) {return alpha*x + ey;}
);
return std::forward<Y>(y);
}
...
auto array1 = axpy(2, array2, +array3); // array1 = 2*array2 + array3; // unary + will make a modifiable copy before it starts.
我會盡可能地維護它,我也歡迎貢獻者。
從性能的角度來看,我嘗試過 boost::MultiArray 和 Armadillo。 兩者都不是很快,因為與數組或向量相比,它們的訪問時間都很慢,而且我能夠在諸如 x1(4:10) = x2(1:6) + x2(2:7) 之類的操作中擊敗這些包+ x2(3:8) 通過使用一個簡單的手動編碼循環(我確信在我的編譯器優化的幫助下)。 當您進入矩陣乘法時,這些包可能會通過 LAPACK 和 BLAS 提供一些好處,但您始終可以自己使用這些接口。
需要注意的是,這是無恥的自我推銷,
https://github.com/ndarray/ndarray
可能值得研究。
雖然它沒有提供優化的數學運算符,但它確實為此提供了 Eigen 接口。 它真正突出的地方在於通過 SWIG 或 Boost.Python 提供與 Python/NumPy 的互操作性。
也許像 BLAS 這樣的庫,一個 CBLAS 存在,但不記得在哪里。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.