在Armadillo库中引用矢量的最快方法

时间:2013-09-17 20:29:25

标签: c++ vector armadillo

我正在使用Armadillo进行线性代数。我设置了一个非常大的矢量(至少35000000个元素)。我有另一个长矢量大矢量的矢量。我使用fftw对大向量进行傅里叶变换,但是前半部分数据是从小向量复制的,如下所示

#include <armadillo>
#include <iostream>
#include <iomanip>
#include <fstream>
#include "fftw3.h"

using namespace std;
using namespace arma;

int main(void)
{
  arma::Col<double> v1, v2;
  v1.resize(35000000);
  v2.resize(17500000);
  // initialize v2
  for (int i=0; i<4096; i++) // repeat 4096 times
  {
    v1.rows(0, 17500000) = v2;
    fftw_complex* in = reinterpret_cast<fftw_complex*>(v1.colptr(0));
    fftw_plan plan = fftw_plan_dft_1d(35000000, in, in, FFTW_FORWARD, FFTW_MEASURE);
    v2 = v1.rows(0, 175000000);
  }
}

这段代码非常慢,因为我们需要将元素从v2复制到v1并向后复制。无论如何要让v1的元素引用v2而不是复制吗?

1 个答案:

答案 0 :(得分:2)

不完全确定你想要实现的目标,但是 你可以通过.memptr()函数得到向量(或矩阵)使用的内存指针。然后可以使用该指针以及偏移量来创建新的向量(或矩阵),该向量通过专用的vector constructorsmatrix constructors使用外部/辅助存储器。

例如:

vec v1(35000000);

vec v2(v1.memptr(), 17500000, false); // v2 will now share memory with v1

顺便说一句,除非你真的想要保留现有数据,否则不要将.resize()函数与Armadillo向量和矩阵一起使用。请改用.set_size(),这要快得多。