繁体   English   中英

如何将Armadillo矩阵转换为立方体?

[英]How do I convert an Armadillo matrix to cube?

我正在尝试重新创建以下Python numpy代码:

num_rows, num_cols = data.shape
N = 4
data = data.reshape(N, num_rows/N, num_cols)

在C ++中使用Armadillo矩阵和立方体? 如何最有效地完成这项工作。 我不认为直接支持调整大小/重塑操作从2d矩阵移动到3d立方体?

构建这样一个多维数据集的最快方法是使用一个高级构造函数 这些允许您直接从内存的任意部分创建新对象,即使不复制任何数据也是如此。 这与NumPy重塑的方式最接近,其中返回原始数据的视图 ,而不是副本。

你会像这样使用构造函数:

// Assuming a is an arma::mat.
int N = 4;
arma::cube c(a.memptr(), N, a.n_rows / N, a.n_cols, false);

这将直接从a获取内存,而不进行复制,并将其用作c的数据。

当然,这很快,但很危险。 只要c在周围,您就有责任保证指向内存有效。 这意味着的寿命c必须严格嵌套在的寿命a 这可能很难确保,尤其是当在堆上创建ac时。

您还可以允许c 复制 a的数据,留下了最后一个参数或将其设置为true 这需要更多的时间比没有拷贝构造函数,但可能低于从分配给每片a的数据,因为此构造函数单个大容量memcpy基础数据。

所有这些都取决于@ ewcz答案提出的行与列主要观点。 确保您知道重塑时得到的结果,特别是如果您使用的是高级构造函数。

由于犰狳使用列主要的数据排序(与依赖于行主要排序的numpy相反),简单地将矩阵放入具有1个切片的立方体并重新整形它将产生不同的结果(下面的矩阵B )。 另一种方法可能是手动构建切片:

#include <iostream>
#include <armadillo>

int main(){

    const arma::uword N = 2;
    const arma::uword num_rows = 4;
    const arma::uword num_cols = 3;

    arma::mat A(num_rows, num_cols, arma::fill::randu);

    std::cout << A;

    arma::cube B(num_rows, num_cols, 1);
    B.slice(0) = A;
    B.reshape(num_rows/N, num_cols, N);
    std::cout << B;

    arma::cube C(num_rows/N, num_cols, N);
    for(arma::uword i = 0; i < N; ++i){
        C.slice(i) = A.rows(i*N, (i+1)*N-1);
    }
    std::cout << C;


    return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM