作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有谁知道使用这些语言 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
请帮忙
最佳答案
(经过编辑以允许移动目标。)
以下内容适用于您的(非常有限!)示例数据集。它的工作原理如下:
由于您的样本数据集很小,因此很难提出优化建议。如果连续行和列之间的距离未知(数据按随机顺序排列,如示例中所示),最好是尝试将整个文件读入内存。
如果您的数据按行进行预排序,则只需在开始时读取一行就足够了,然后对于每个循环,读取下一行。此外,如果数据也按列排序,您可以跳过整个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/
我是一名优秀的程序员,十分优秀!