【问题标题】:Create a NDArray in an oct file from a double pointer从双指针在 oct 文件中创建 NDArray
【发布时间】:2015-05-08 03:19:48
【问题描述】:

考虑在 C++ Octave 函数中创建 3 维数组 NDArray 的问题。

我有一个双指针double* ptr 和来自犰狳cube 的尺寸int dim[3]。我在 Octave 文档中找到了一个很有前途的 NDArray constructor

NDArray::NDArray    (   
    double *    sdata,
    octave_idx_type     slen,
    octave_idx_type *   adims,
    void *      arep 
)   

我找不到关于参数是什么的任何描述,但我做出了这个猜测:sdata 似乎是原始数据指针,slenadims 似乎分别是长度和暗向量.但是,arep 应该是什么?

【问题讨论】:

标签: c++ c pointers octave armadillo


【解决方案1】:

dNDArray.h 的The source

// For jit support only

所以好像没把握用。

来自the octave documentation

使用dim_vector 定义矩阵或数组的维度 与从 size 返回的向量具有相同的特征。为了 示例:

dim_vector dv (2); dv(0) = 2; dv(1) = 3;  // 2 rows, 3 columns Matrix
a (dv);

这可用于所有矩阵和数组类型

但是这个构造函数已被弃用。相反,使用

NDArray a (dim_vector(dim[0], dim[1], dim[2]));

然后循环遍历 (i, j, k) 索引以将立方体复制到八度数组

double* a_vec = a.fortran_vec ();
for (int i = 0; i < dim[0]; i++) {
    for (int j = 0; j < dim[1]; j++) {
        for (int k = 0; k < dim[2]; k++) {
            *a_vec++ = armadillo_cube(i, j, k);
        }
    }
}

【讨论】:

  • 我不熟悉犰狳,但 Octave 是像 Fortran 一样的列专业。也许需要在分配上交换索引。
  • Thks ederag,但这正是我试图避免的,在立方体上循环(这很耗时,不是吗?)。我认为应该有一种方法可以从 double* 和相应的维度构造一个 NDArray。
  • @carandraug 通常你是对的。根据armadillo doccube(n_rows, n_cols, n_slices)。所以听起来不错?
  • @mvillegas 我理解你的问题,但据我所知,没有官方机制。即使是逐个元素的副本,文档也很少。是否值得优化很大程度上取决于程序其余部分所需的时间。无论如何,我也很想看看如何将整个记忆传递到八度。 This thread 可能是相关的(尤其是提议的变更集)。
  • @mvillegas 因为@ederag 说犰狳也是主要的专栏,你可以使用 fortran_vec() 加快这个速度(见我的编辑)。它仍然会导致复制,但会保存 () 运算符的计算(这是最大的减速)。如果你能在犰狳身上找到类似的东西......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多