我有一个方法将std :: vector作为其参数之一。有没有一种方法可以通过将std :: vector分配给矩阵来初始化矩阵?以下是我在下面试图做的。有谁知道我可以如何实现分配矢量(或甚至双打指针)到矩阵?提前致谢。迈克使用std :: vector或数组初始化boost矩阵
void Foo(std::vector v)
{
matrix<double> m(m, n, v);
// work with matrix...
}
我有一个方法将std :: vector作为其参数之一。有没有一种方法可以通过将std :: vector分配给矩阵来初始化矩阵?以下是我在下面试图做的。有谁知道我可以如何实现分配矢量(或甚至双打指针)到矩阵?提前致谢。迈克使用std :: vector或数组初始化boost矩阵
void Foo(std::vector v)
{
matrix<double> m(m, n, v);
// work with matrix...
}
按照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()];
}
}
}
几个关于您所提供的代码说明:性病::矢量需要一个模板参数,您声明m
为基体的输入参数,以它的构造。
这里又是如何可以做到这一点的另一个例子:
#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;
}
的更方便的方法是这样的:
matrix<double> m(m*n);
std::copy(v.begin(), v.end(), m.data().begin());
矩阵是二维结构,载体是一个三维结构。您如何计划通过检查矢量来确定矩阵的正确尺寸? – Mankarse