![](/img/trans.png)
[英]Initializing boost::shared_ptr<std::vector<T>> with boost::shared_ptr<std::list<T>>
[英]Initializing boost matrix with a std::vector or array
我有一個將 std::vector 作為其參數之一的方法。 有沒有辦法通過將 std::vector 分配給矩陣來初始化矩陣? 這是我在下面嘗試做的。 有誰知道我如何實現將向量(甚至是雙精度指針)分配給矩陣? 提前致謝。 麥克風
void Foo(std::vector v)
{
matrix<double> m(m, n, v);
// work with matrix...
}
這是如何做到這一點的另一個例子:
#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());
根據boost matrix 文檔,矩陣類有 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
聲明為矩陣和它的構造函數的輸入參數。
簡單的答案,但從 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 ,example 3,相關問題提到: ublas: Wrap ublas::vector as ublas::matrix_expression
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.