【问题标题】:Armadillo: Obtain raw data from matrix/vector as array犰狳:从矩阵/向量中获取原始数据作为数组
【发布时间】:2014-06-10 17:32:36
【问题描述】:

我正在寻找这样的东西:

fmat A     = randu<fmat>(4,5);
float **a  = A.to_array();     // Return matrix as float**

有人知道如何在Armadillo 中做到这一点吗?

【问题讨论】:

  • 双指针(例如float**)是 C++ 从 C 继承的最糟糕的东西之一。最好不要在任何新代码中使用此类功能。这是不安全的,需要大量的样板代码才能正确跟踪。如果不使用它,你会省去很多麻烦。如果您需要传递数据,最好传递对fmat 对象的引用。例如,void fn(const fmat&amp; A)
  • 嗨@mtall,我之所以使用它是因为我想将原始矩阵传递给一个需要float**的CUDA函数。
  • 如果您想要基于 GPU 的矩阵乘法,请使用带有 nvBLAS 的 Armadillo,而不是标准的 BLAS。一般来说,使用 GPU 进行矩阵乘法只对大于 5000x5000 的矩阵大小有用。

标签: c++ armadillo


【解决方案1】:

没有返回指针数组的函数。您可以使用memptr() method 访问底层缓冲区:

float *a = A.memptr();

您还可以使用colptr() method 获取指向任何矩阵列的指针。我不知道为什么你可能需要一个指针数组,但你可以像这样构建一个(未编译和未经测试的代码):

std::vector<float *> av;
av.reserve(A.n_cols);
for (unsigned int i = 0; i < A.n_cols; ++i)
   av.push_back() = A.colptr(i);

float **a = &av[0]; // a remains valid while av is in scope

请注意,Armadillo 将数据存储在 column-major order

【讨论】:

  • 谢谢。您的意思是“可以”在某些时候可能不安全吗? :)
  • 文档声明不推荐使用memptr(),除非您知道自己在做什么。但我只是强调,虽然没有一个函数可以完全满足您的需求,但还有另一种方法可以访问原始内存。
  • 好的,知道了。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多