二维矩阵数据线性插值算法(等值线线性插值算法)

2021年7月15日 9795点热度 11人点赞 0条评论

线性插值公式

现在又两个数,2和6,在中间插入一个数值,那么我们一般用(2+6)/2 = 4,这样在中间插入一个值。

那么在A和B之间插入数据的公式为(A+B)/2。

一维数据线性插值

有这样一个长度为6一维数组:

{1,5,7,9,10,14}

在每两个数中插入一个数值,之后得到一个长度为11的数组。

只需要先调整原数据的位置,将索引*2得到在新数组中的位置,然后再利用上面的插值公式 d[index] = (d[index-1] + d[index+1])/2。代码如下:

const int length = 6;
const int newLength = 2*length-1;
int array[length] = {1,5,7,9,10,14};
int newArray[newLength];
for(int index = 0;index < newLength;index+=2)
{
    newArray[index] = array[index/2];
}
for(int index = 1;index < newLength;index+=2)
{
    newArray[index] = (newArray[index - 1] + newArray[index + 1])/2;
}

这样就得到了新的数组{1,3,5,6,7,8,9,9,10,12,14,}。

二维矩阵插值公式

先将问题简化,这里以一个4*4的数据插值为7*7的数据为例。

{{1, 5, 4, 10},

{ 2, 6, 1, 9},

{10, 2, 5, 1},

{9, 14, 2, 6}}

将数据放到新的矩阵中之后,先横向进行插值。

{{ 1, 3, 5, 4, 4, 7, 10,}

{ X, X, X, X, X, X, X,}

{ 2, 4, 6, 3, 1, 5, 9,}

{ X, X, X, X, X, X, X,}

{ 10, 6, 2, 3, 5, 3, 1,}

{ X, X, X, X, X, X, X,}

{ 9, 11, 14, 8, 2, 4, 6,}}

X表示还未插值的地方。

然后再纵向进行插值。

{{ 1, 3, 5, 4, 4, 7, 10,}

{ 1, 3, 5, 3, 2, 6, 9,}

{ 2, 4, 6, 3, 1, 5, 9,}

{ 6, 5, 4, 3, 3, 4, 5,}

{ 10, 6, 2, 3, 5, 3, 1,}

{ 9, 8, 8, 5, 3, 3, 3,}

{ 9, 11, 14, 8, 2, 4, 6,}}

这样就完成了一个二维矩阵的插值。

const int width = 4;
const int height = 4;
const int newWidth = 2*width - 1;
const int newHeight = newWidth;
int array[width][height] = {{1,5,4,10},
                            {2,6,1,9},
                            {10,2,5,1},
                            {9,14,2,6}};
int newArray[newWidth][newHeight];
for(int i =0; i <newWidth*newHeight;i++)
{
    newArray[i/newWidth][i%newWidth] = 0;
}
for(int i = 0;i < newWidth*newHeight;i+=2)
{
    int hi = i/newWidth;
    int wi = i%newWidth;
    newArray[wi][hi] = array[wi/2][hi/2];
}
for(int r = 0;r < newHeight;r+=2)
{
    for(int l = 1;l < newWidth;l+=2)
    {
        newArray[r][l] = (newArray[r][l -1] + newArray[r][l + 1])/2;
    }
}
for(int l = 0;l < newWidth;l++)
{
    for(int r = 1;r < newHeight;r+=2)
    {
        newArray[r][l] = (newArray[r - 1][l] + newArray[r + 1][l])/2;
    }
}
std::cerr << "{";
for(int w = 0;w < newHeight;w++)
{
    std::cerr << "{" ;
    for(int h = 0;h < newHeight;h++)
    {
        std::cerr <<" "<< newArray[w][h] << ",";
    }
    std::cerr << "}" << std::endl;
}
std::cerr << "}";

补充

将线性插值的数据可视化:http://cppdebug.com/archives/189

大脸猫

这个人虽然很勤快,但什么也没有留下!

文章评论