提升uBLAS矩阵/向量乘积

7

请问有没有人可以提供一个使用uBLAS product来做乘法的例子?如果您有更好的C++矩阵库推荐,我也非常欢迎。这个问题已经让我头疼了很久。

下面是我的代码:

vector<double> myVec(scalar_vector<double>(3));
matrix<double> myMat(scalar_matrix<double>(3,3,1));
matrix<double> temp = prod(myVec, myMat);

以下是错误信息:

cannot convert from 'boost::numeric::ublas::matrix_vector_binary1<E1,E2,F>' to 'boost::numeric::ublas::matrix<T>'

我已经尽力搜索了,Stackoverflow上有一个关于这个问题的问题在这里。Boost文档中有一个例子在这里。 我已经复制了示例代码,但对我没有用,因为对于我来说,适用于标准输出的模板魔法是无用的。
#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/io.hpp>

int main () {
    using namespace boost::numeric::ublas;
    matrix<double> m (3, 3);
    vector<double> v (3);
    for (unsigned i = 0; i < std::min (m.size1 (), v.size ()); ++ i) {
        for (unsigned j = 0; j < m.size2 (); ++ j)
            m (i, j) = 3 * i + j;
        v (i) = i;
    }

    std::cout << prod (m, v) << std::endl;
    std::cout << prod (v, m) << std::endl;
}
2个回答

10

向量与矩阵相乘的结果是一个向量,而不是矩阵。


是的,那个可以运行。虽然我不明白为什么它不能同时适用于 1x3 矩阵。 - Budric
可以这样做,但你需要将其声明为矩阵。我认为问题在于Boost试图提供灵活性,同时仅使用头文件。这使得在某些情况下难以使用,而模板的复杂性开始让你发疯。 - JCooper
这就是我对Boost的了解。我认为Eigen库(也是仅有头文件)在模板、速度和可用性之间取得了良好的平衡。因此,我选择使用该解决方案,而不是使用Boost uBLAS。 - Budric
只有当M为矩阵,V为行向量时,M.V^T=(V.M)^T才成立。 - Nikolay Frick

3
我还没有深入研究Boost uBLAS,但Eigen确实很不错,并且性能也很好。

谢谢,我会看一下。哇,到目前为止我真的很喜欢这个。我花了一些时间在谷歌上搜索矩阵库,但是这没有出现。通常你能得到LAPACK++ MTL和其他结果。有时它们不是开源许可的。有时它们不够优雅。 - Budric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接