4

線形代数には 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を参照するようにしますか?

4

1 に答える 1

2

何を達成しようとしているのか正確にはわかりませんが、.memptr()関数を介して、ベクトル (または行列) が使用するメモリへのポインターを取得できます。このポインターをオフセットと共に使用して、専用のベクター コンストラクターマトリックス コンストラクターを介して外部/補助メモリを使用する新しいベクター (またはマトリックス) を作成できます。

例えば:

vec v1(35000000);

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

ちなみに、本当に既存のデータを保持するつもりがない限り、Armadillo のベクトルと行列で.resize()関数を使用しないでください。代わりに、はるかに高速な.set_size()を使用してください。

于 2013-09-18T02:48:52.820 に答える