4

我将犰狳用于线性代数。我设置了一个相当大的向量(至少 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而不是副本?

4

1 回答 1

2

不完全确定您要实现什么,但您可以通过.memptr()函数获取指向向量(或矩阵)使用的内存的指针。然后可以使用这个指针和一个偏移量来创建一个新的向量(或矩阵),它通过专用的向量构造函数矩阵构造函数使用外部/辅助存储器。

例如:

vec v1(35000000);

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

顺便说一句,除非您真的想保留现有数据,否则不要将.resize()函数与犰狳矢量和矩阵一起使用。使用.set_size()代替,这要快得多。

于 2013-09-18T02:48:52.820 回答