从双指针在oct文件中创建数据阵列 < >考虑在C++八倍频函数中创建三维数组 NDArray < /> > < < /P>

从双指针在oct文件中创建数据阵列 < >考虑在C++八倍频函数中创建三维数组 NDArray < /> > < < /P>,c++,c,pointers,octave,armadillo,C++,C,Pointers,Octave,Armadillo,我有一个双指针double*ptr和来自犰狳立方体的维度int dim[3]。我在Octave docs中发现了一个很有前途的方法: NDArray::NDArray ( double * sdata, octave_idx_type slen, octave_idx_type * adims, void * arep ) 我找不到关于参数是什么的任何描述,但我做了这样的猜测:sdata似乎是原始数据指针,slen

我有一个双指针
double*ptr
和来自犰狳
立方体的维度
int dim[3]
。我在Octave docs中发现了一个很有前途的方法:

NDArray::NDArray    (   
    double *    sdata,
    octave_idx_type     slen,
    octave_idx_type *   adims,
    void *      arep 
)   
我找不到关于参数是什么的任何描述,但我做了这样的猜测:
sdata
似乎是原始数据指针,
slen
adims
似乎分别是长度和尺寸向量。但是,dNDArray.h说,arep应该是什么

// For jit support only
因此,它似乎不一定会使用

使用
dim_向量定义矩阵或数组的维数
与从大小返回的向量具有相同的特性。对于
例如:

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);
        }
    }
}
double*a_vec=a.fortran_vec();
对于(int i=0;i
,第135行。顺便说一句,这些都是受保护的方法。我对犰狳不太熟悉,但八度音阶和Fortran一样是主调。也许在赋值.Thks ederag上需要交换索引,但这正是我试图避免的,在多维数据集上循环(这很耗时,不是吗?)。我认为应该有一种方法可以用
double*
和相应的维度构造一个数据数组。@carandraug一般来说你是对的。根据,
多维数据集(n行、n列、n片)
。听起来不错?@mvillegas我理解你的问题,但据我所知,没有官方的机制。而且,即使是元素对元素的拷贝,文档也很少。它是否值得优化很大程度上取决于程序剩余部分所需的时间。无论如何,我也很想看看如何把整个记忆串传递到八度。可能是相关的(尤其是建议的变更集)。@mvillegas因为@ederag说armadillo也是主要列,您可以使用fortran_vec()来说明这一点(请参见我的编辑)。它仍然会导致复制,但保存了
()
运算符的计算(这是最大的减速)。如果你能在犰狳身上找到这样的东西。。。