gpt4 book ai didi

c - 从 C 到 gnuplot 的曲面绘图管道

转载 作者:太空宇宙 更新时间:2023-11-04 02:42:54 26 4
gpt4 key购买 nike

我创建了一个函数,它成功地将数据从我的 C 程序传输到 gnuplot:

void gnuprintabs(FILE *gp,double **RE,double **IM, double x[], int N)
{
int i,j;

fprintf(gp, "splot '-'\n");

for (i=0; i<N; i++)
{
for(j=0; j<N; j++)
{
fprintf(gp, "%g %g %g\n", x[i],x[j],sqrt(RE[i][j]*RE[i][j]+IM[i][j]*IM[i][j]));
}
}
fflush(gp);
fprintf(gp, "e\n");
}

函数本身处于一个循环中,从而不断更新 2D RE 和 IM 数组。

我的问题是如何使该图成为实体表面而不是单点或单线?

如果我告诉 gnuplot set pm3d\n,它会返回一个错误:

single isoline < scan > is not enough for pm3d plot

有办法解决这个问题吗?

谢谢

最佳答案

要获得曲面图,您必须将两个具有相同 x 值的 block 分开,但通过空行更改 y 值(反之亦然):

x1 y1 z11
x1 y2 z12
...
x1 yN z1N

x2 y1 z21
x2 y2 z22
..
x2 yN z2N

x3 y1 z31
...

即在内部 for 循环之后打印一个换行符

void gnuprintabs(FILE *gp,double **RE,double **IM, double x[], int N)
{
int i,j;

fprintf(gp, "splot '-'\n");

for (i=0; i<N; i++)
{
for(j=0; j<N; j++)
{
fprintf(gp, "%g %g %g\n", x[i],x[j],sqrt(RE[i][j]*RE[i][j]+IM[i][j]*IM[i][j]));
}
fprintf(gp, "\n");
}
fflush(gp);
fprintf(gp, "e\n");
}

如果吞吐量可能成为问题,并且您的 x 步和 y 步是等距的,您还可以将数据写为矩阵格式:

void gnuprintabs(FILE *gp,double **RE,double **IM, double x[], int N)
{
int i,j;

fprintf(gp, "x0 = %e; dx = %e; y0 = %e; dy = %e;\n", x[0], x[1]-x[0], y[0], y[1]-y[0]);

fprintf(gp, "splot '-' matrix using (x0+dx*$1):(y0+dy*$2):3\n");

for (i=0; i<N; i++)
{
for(j=0; j<N; j++)
{
fprintf(gp, "%g ", sqrt(RE[i][j]*RE[i][j]+IM[i][j]*IM[i][j]));
}
fprintf(gp, "\n");
}
fflush(gp);
fprintf(gp, "e\n");
}

关于c - 从 C 到 gnuplot 的曲面绘图管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30104870/

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