【问题标题】:Initializing boost matrix with a std::vector or array用 std::vector 或数组初始化 boost 矩阵
【发布时间】:2011-11-13 03:44:40
【问题描述】:

我有一个将 std::vector 作为其参数之一的方法。有没有办法通过将 std::vector 分配给矩阵来初始化矩阵?这是我在下面尝试做的事情。有谁知道我如何实现将向量(甚至是双精度指针)分配给矩阵?提前致谢。迈克

void Foo(std::vector v)
{
    matrix<double> m(m, n, v);
    // work with matrix...
}

【问题讨论】:

  • 矩阵是二维结构,向量是一维结构。您打算如何通过检查向量来确定矩阵的正确维度?

标签: c++ boost matrix ublas


【解决方案1】:

这是另一个如何做到这一点的例子:

#include <algorithm>
#include <vector>
#include <boost/numeric/ublas/storage.hpp>
#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/io.hpp>

namespace ublas = boost::numeric::ublas;

template <typename T, typename F=ublas::row_major>
ublas::matrix<T, F> makeMatrix(std::size_t m, std::size_t n, const std::vector<T> & v)
{
    if(m*n!=v.size()) {
        ; // Handle this case
    }
    ublas::unbounded_array<T> storage(m*n);
    std::copy(v.begin(), v.end(), storage.begin());
    return ublas::matrix<T>(m, n, storage);
}

int main () {;
    std::vector<double> vec {1, 2, 3, 4, 5, 6};
    ublas::matrix<double> mm = makeMatrix(3,2,vec);
    std::cout << mm << std::endl;
}

【讨论】:

    【解决方案2】:

    根据boost matrix documentation,矩阵类有3个构造函数:空的,复制的,一个取两个size_types的行数和列数。由于 boost 没有定义它(可能是因为有很多方法可以做到这一点,而且不是每个类都定义转换为其他类),所以您需要定义转换。

    这是我会使用的一种方法,但由于有多种方法可以做到这一点,并且问题没有指定您希望如何完成,您可能会找到更适合您的情况的不同方法。

    void Foo(const std::vector<double> & v) {
       size_t m = ... // you need to specify
       size_t n = ... // you need to specify
    
       if(v.size() < m * n)   { // the vector size has to be bigger or equal than m * n
          // handle this situation
       }
    
       matrix<double> mat(m, n);
       for(size_t i=0; i<mat.size1(); i++) {
          for(size_t j=0; j<mat.size2(); j++) {
             mat(i,j) = v[i+j*mat.size1()];
          }
       }
    }
    

    关于您提供的代码的几点说明:std::vector 需要一个模板化参数,并且您将 m 声明为矩阵和它的构造函数的输入参数。

    【讨论】:

      【解决方案3】:

      更方便的方式是这样的:

      matrix<double> m(m*n);
      std::copy(v.begin(), v.end(), m.data().begin());
      

      【讨论】:

        【解决方案4】:

        简单的答案,但在 Boost 文档中不是很明显。

        您可以只使用 std::vector 作为存储数组模板参数的类型,而不是矩阵的默认 unbounded_array。 (在关于 matrix 类的文档的脚注 2 中提到。)

        void Foo(const std::vector<double> &v, size_t n)
        {
            using namespace boost::numeric::ublas;
        
            size_t m = v.size() / n;
            matrix< double, row_major, std::vector<double> > M(m, n);
            M.data() = v;
        
            // work with matrix...
        }
        

        更多的初始化变体可以在你的 boost 源码中找到: boost/libs/numeric/ublas/doc/samples/assignment_examples.cpp,这里指出:assign multiple values to boost::numeric::ublas::vector in c++

        或这里:uBLAS examples,示例 3,相关问题提到:ublas: Wrap ublas::vector as ublas::matrix_expression

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-06
          • 1970-01-01
          • 2013-07-25
          • 1970-01-01
          相关资源
          最近更新 更多