gpt4 book ai didi

c++ - 使用 c/awk/shell 对二维数据进行双线性插值

转载 作者:行者123 更新时间:2023-11-30 20:40:32 25 4
gpt4 key购买 nike

有谁知道使用这些语言 c/awk/shell/c++ 进行数据双线性插值

我的数据文件,这个文件没有排序,不知道怎么办:(非常大的文件

 row col data 
20 14 91
21 15 95
21 14 162
20 15 210

我期望输出像这样 0.5 列间隔和 0.2 行间隔

 20 14 91 
20 14.5 150.5
20 15 210
20.2 14.5 146.1
.....
.....
.....
21 14 162
21 14.5 128.5
21 15 95

请帮忙

最佳答案

(经过编辑以允许移动目标。)

以下内容适用于您的(非常有限!)示例数据集。它的工作原理如下:

  1. 将数据集加载到内存中并将其存储在简单的结构中。
  2. 对于每个行/列数据项,查找所需的下一项:(row,col>=1)、(row>=1,col) 和 (row>=1,col>=1)。未经测试(因为缺乏数据),但它应该使用最接近的值。
  3. 如果所有四个数据点均已知,则从左到右、从上到下进行插值。

由于您的样本数据集很小,因此很难提出优化建议。如果连续行和列之间的距离未知(数据按随机顺序排列,如示例中所示),最好是尝试将整个文件读入内存。

如果您的数据按进行预排序,则只需在开始时读取一行就足够了,然后对于每个循环,读取下一行。此外,如果数据也按排序,您可以跳过整个find_set例程并立即为连续的项目调用interpolate。 p>

围绕所有 printf 语句的错误是因为标准 C printf 格式说明符不提供您的首选输出格式。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_ITEM 25

struct data_t {
int row;
int col;
int data;
} array[MAX_ITEM];

int n_item = 0;

// interpolate A > B
// v v
// C > D
void interpolate (int A, int B, int C, int D)
{
int i,j, deltaCol,deltaRow;
float a,b, delta_AC, delta_BD, value;

a = array[A].data;
b = array[B].data;

deltaCol = 2*(array[B].col-array[A].col);
deltaRow = 5*(array[C].row-array[A].row);

delta_AC = (array[C].data-array[A].data)/(float)deltaRow;
delta_BD = (array[D].data-array[B].data)/(float)deltaRow;

// rows
for (j=0; j<=deltaRow; j++)
{
// columns
for (i=0; i<=deltaCol; i++)
{
if (j % 5)
printf ("%.1f ", array[A].row+(j/5.0f));
else
printf ("%d ", array[A].row+j/5);
if (i % 2)
printf ("%.1f ", array[A].col+(i/2.0f));
else
printf ("%d ", array[A].col+i/2);

value = a+(b-a)*((float)i/deltaCol);
if ((int)(100*value+0.5) % 100)
printf ("%.1f\n", value);
else
printf ("%d\n", (int)(value+0.5f));

}
a += delta_AC;
b += delta_BD;
}
}

// For a start row/col A find B,C,D
// where B = A(0,>=1), C=A(>=1,0), D=A(>=1,>=1)
void interpolate_from (int A)
{
int i, B=-1, C=-1, D=-1;

for (i=0; i<n_item; i++)
{
if (i == A) continue;
if (array[A].row == array[i].row)
{
if (array[A].col < array[i].col || (B != -1 && array[i].col < array[B].col))
{
B = i;
}
} else
if (array[A].row < array[i].row)
{
if (array[A].col == array[i].col)
{
C = i;
} else
{
if (array[A].col < array[i].col || (D != -1 && array[i].col < array[D].col))
{
D = i;
}
}
}
if (B+1 && C+1 && D+1)
{
interpolate (A,B,C,D);
return;
}
}

}

int main (void)
{
int i,j,k;
FILE *f;

f = fopen ("data.txt", "r");
while (n_item < MAX_ITEM && fscanf (f, "%d %d %d", &i,&j, &k) == 3)
{
array[n_item].row = i;
array[n_item].col = j;
array[n_item].data = k;
n_item++;
}
fclose (f);

for (i=0; i<n_item; i++)
interpolate_from (i);

printf ("\n");
return 0;
}

修改后的数据集

20 14 91
21 14 162
21 18 95
20 18 210

输出是:

20 14 91
20 14.5 105.9
20 15 120.8
20 15.5 135.6
...

(等等——运行查看结果)

关于c++ - 使用 c/awk/shell 对二维数据进行双线性插值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21804031/

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