我有一个方法,它将std :: vector作为其参数之一。有没有办法通过将std :: vector赋值给矩阵来初始化矩阵?这是我下面尝试做的。有谁知道如何实现将向量(甚至是双精度指针)分配给矩阵?提前致谢。迈克
void Foo(std::vector v)
{
matrix<double> m(m, n, v);
// work with matrix...
}
答案 0 :(得分:5)
以下是另一个如何做到这一点的例子:
#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;
}
答案 1 :(得分:3)
根据boost matrix documentation,矩阵类有3个构造函数:empty,copy和一个带有两个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
声明为矩阵,并将其作为构造函数的输入参数。
答案 2 :(得分:2)
更方便的方法是:
matrix<double> m(m*n);
std::copy(v.begin(), v.end(), m.data().begin());
答案 3 :(得分:0)
简单的答案,但在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