我正在使用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而不是复制吗?
答案 0 :(得分:2)
不完全确定你想要实现的目标,但是 你可以通过.memptr()函数得到向量(或矩阵)使用的内存指针。然后可以使用该指针以及偏移量来创建新的向量(或矩阵),该向量通过专用的vector constructors和matrix constructors使用外部/辅助存储器。
例如:
vec v1(35000000);
vec v2(v1.memptr(), 17500000, false); // v2 will now share memory with v1
顺便说一句,除非你真的想要保留现有数据,否则不要将.resize()函数与Armadillo向量和矩阵一起使用。请改用.set_size(),这要快得多。