从 C 数组(列优先)转换为犰狳矩阵(arma::mat)而不复制

Posted

技术标签:

【中文标题】从 C 数组(列优先)转换为犰狳矩阵(arma::mat)而不复制【英文标题】:convert from C array (column-major) to armadillo matrix (arma::mat) without copying 【发布时间】:2016-01-14 07:54:24 【问题描述】:

我有一个指向列优先的 C 双数组的指针,它想转换为 arma::mat,我从文档中了解到它也是列优先的。

我见过std::transform 函数,但我相信 std 中的矩阵是行优先的。在犰狳包中有conv_to<mat>::from(),它似乎可以与std::arrayarma::mat 一起使用,这可以与列主要C 数组一起使用吗?。

您能告诉我如何将 C 结构传递给 arma::mat 而不复制并返回到 C 数组吗?

非常感谢

【问题讨论】:

【参考方案1】:

来自犰狳的文档: (http://arma.sourceforge.net/docs.html#Mat)

高级构造函数

mat(ptr_aux_mem, n_rows, n_cols, copy_aux_mem = true, strict = false)  

使用可写辅助(外部)内存中的数据创建矩阵,其中 ptr_aux_mem 是指向内存的指针。默认情况下,矩阵分配自己的内存并从辅助内存中复制数据(为了安全)。但是,如果将 copy_aux_mem 设置为 false,则矩阵将改为直接使用辅助内存(即不复制);这更快,但除非您知道自己在做什么,否则可能会很危险!

strict参数只有在copy_aux_mem设置为false时才生效(即矩阵直接使用辅助内存)

当 strict 设置为 false 时,矩阵将使用辅助内存,直到大小发生变化 当 strict 设置为 true 时,矩阵将在其生命周期内绑定到辅助内存;矩阵中的元素个数不能改变 在 6.000+ 版本中默认设置为 false 在 5.600 及更早版本中默认设置为 true

【讨论】:

非常感谢您的回答。有没有办法在不复制的情况下将arma::mat 返回到以列为主的 C 数组? 可能使用“.memptr()” - 只需查看文档即可。我以前从没用过犰狳……

以上是关于从 C 数组(列优先)转换为犰狳矩阵(arma::mat)而不复制的主要内容,如果未能解决你的问题,请参考以下文章

犰狳矩阵列的非连续访问

在犰狳中将矩阵除以向量

犰狳中正确的对角矩阵

结构定义的类型的犰狳 arma::Col

armadillo C++:从数组初始化矩阵

(Rcpp, armadillo) 将 arma::vec 转换为 arma::mat