gpt4 book ai didi

c - 传递给 pgplot 时,是否有一种 O(1) 方法来分离复数数组的实部和虚部?

转载 作者:太空宇宙 更新时间:2023-11-04 00:18:21 25 4
gpt4 key购买 nike

我的代码中有一个库为我生成的复杂 float 组。考虑它是这样的:

float _Complex data[N];

为了将它作为具有实部和虚部的单独数组,我遍历数组并采用如下值:

float real[N];
float imag[N];
for (int pt=0;pt<N;pt++) {
real[pt] = creal(data[pt]);
imag[pt] = cimag(data[pt]));
}

但这真的很低效,因为就执行时间和空间而言,这是一个 O(N) 操作。我想知道是否可以使用一些指针算法来分隔数组,以便减少执行时间和内存使用?

我需要分别绘制实值和虚值。我的绘图库 PGPLOT 需要向其发送一组值,因此我无法“就地”使用复杂数组。

最佳答案

pgplot 库提供了一个无跨界的界面来绘制标记数组:

void cpgpt(int n, const float *xpts, const float *ypts, int symbol);

但这只是对 cpgpt1 的单个调用的薄包装。因此,很容易添加一个跨界界面:

void cpgpts(int n, int stride, const float *xpts, const float *ypts, int symbol) {
for (int i = 0; i < n; ++i) {
cpgpt1(*xpts, *ypts, symbol);
xpts += stride;
ypts += stride;
}
}

当然,您会希望围绕复杂到 float 转换的丑陋之处编写包装器。例如:

void cpgptsc(int n, const float _Complex *pts, int symbol) {
cpgpts(n, 2, (const float*)pts, ((const float*)pts)+1, symbol);
}

例子:

// Plot the data as symbols on the Re-Im plane
cpgptsc(count, data, symbol);

您可以类似地重新实现cpgline:

void cpglines(int n, int stride, const float *xpts, const float *ypts, int symbol) {
cpgmove(*xpts, *ypts);
for (int i = 1; i < n; ++ i) {
xpts += stride;
ypts += stride;
cpgdraw(*xpts, *ypts);
}
}

void cpglinesc(int n, const float _Complex *pts, int symbol) {
cpglines(n, 2, (const float*)pts, ((const float*)pts)+1, symbol);
}

例子:

// Plot the data as lines on the Re-Im plane
cpglinesc(count, data);

如果您只绘制单个组件(无论是真实的还是虚构的),为它创建一个合理的包装器同样简单:

void cpglinesx(int n, int stride, float dx, float x0, const float *ypts) {
cpgmove(x0, *ypts);
for (int i = 1; i < n; ++ i) {
x0 += dx;
ypts += stride;
cpgdraw(x0, *ypts);
}
}

void cpglinesxre(int n, float dx, float x0, const float _Complex *pts) {
cpglinesx(n, 2, dx, x0, (const float*)pts);
}

void cpglinesxim(int n, float dx, float x0, const float _Complex *pts) {
cpglinesx(n, 2, dx, x0, ((const float*)pts)+1);
}

然后,例如,要绘制从 x=0 开始且增量为 1.0 的虚部,您可以:

// Plot the imaginary coordinates of all the data
cpglinesxim(count, 1.0, 0.0, data);

关于c - 传递给 pgplot 时,是否有一种 O(1) 方法来分离复数数组的实部和虚部?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24817592/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com