0

std::vector <int> density;ファイルからインポートされた一連の値を格納するベクトルがありinput.csvます。

int C値は 0 から 2^16 の間で変化し、列と行の規則的なグリッドに並べられますint L

ここで、双一次補間を使用して新しい値のセットを計算したいと思いますstd::vector <float> D

これらの新しい値は、int x列とint y線の別の規則的なグリッドに配置されます。

.

私の問題:

データの二乗グリッドに基づいて双一次補間を実行するには、位置ごと(x,y)にローカルの 4 つの周囲のdensity値を知る必要があります。

D1 (C,L), D2 (C,L), D3 (C,L), D4 (C,L)

言い換えると、D位置(Dx,Dy)(Dx と Dy が 1 以下の場合) の各補間点は、元のグリッドdensityの位置に相対的な 4 つの値によって定義される元のデータセットの四角形の「セル」内に配置されます。(C,L)

周囲の 4 つの値(Dx,Dy)の範囲内(グリッドの外側ではない!) のC任意の位置を簡単に定義するにはどうすればよいですか?LdensityD1, D2, D3, D4

そして、セル内で、ポイントによって定義された(D1, D2, D3, D4)位置を定義するにはどうすればよいですか(ポイントを理解するためのコードを参照してください)。(u,v)dd

コードの改善にご協力いただければ... :) ありがとうございます!

///

概念化を容易にするために、数値を使用した例を次に示します。

  • 入力.csv

    200; 300; 400

    100; 100; 100

    0; 100; 200

  • 列の数:C = 3

  • 行数 :L = 3

  • これらを押し戻した後、ベクトル a には以下が含まれます。

    200、300、400、100、100、100、0、100、200

  • 新しいファイルの列数: x = 4

  • 新しいファイルの行数: y = 4

  • アルゴリズムは次のことを行う必要があります。

ポジションのために(Dx, Dy) = (0, 0)

(u, v) = (0, 0)

私たちは最初のセルにいるので

(D1, D2, D3, D4) = (200, 300, 100, 100)

それ以来(u, v) = (0, 0)

密度は等しいD1 = 200

それでb = 200

Dxここで、 >の次の xalue に渡しDx = x+1 ます (1 を返します)

  • Cに等しい3xに等しい4、およびDx * C / x = 1 * 2 / 3 = 0.666666667または2/3

  • 2/3 < 1だから私たちはまだ最初のセルにいます

ポジションのために(Dx, Dy) = (2/3, 0)

(u, v) = (2/3, 0)

u > 0v = 0密度は と の間にD1あるのでD2

d = u * D2 + (1-u) * D1   (returns 266.666666667)

4 つの列と 4 つの行を含むファイルを想像してみoutput.csvましょう。結果として、次のものが含まれている必要があります。

200;          266.6666667;  333.3333333;  400
133.3333333;  155.5555556;  177.7777778;  200
66.66666667;  66.88888889;  111.1111111;  133,3333333
0;            66.66666667;  133,3333333;  200
  • 入力 3 x 3 は次のとおりです。

    200; 300; 400

    100; 100; 100

    0; 100; 200

///

コード:

#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

//_____________________________________________________________________________

int main() {

/// original grid

int C = 0;                  // amount of columns in the .csv
int L = 0;                  // amount of lines   in the .csv
int a = 0;                  // a variable temporarily stores .csv value
std::vector <int> density;  // stores a dataset from the .csv

//_____________________________________________________________________________

    ifstream ifs ("input.csv");                 // importing the .csv

    cout << "number of columns?" << endl;       // specifying number of columns
    cin  >> C;
    cout << endl;
    cout << "number of lines?" << endl;         // specifying number of lines
    cin  >> L;
    cout << endl;


    char dummy;

        for (int i = 0; i < L; ++i){            // pushing the values of the .csv into the vector
            for (int i = 0; i < C; ++i){
                ifs >> a;
                density.push_back(a);

                    if (i < (C - 1))
                        ifs >> dummy;
            }

//_______________________________________________________________________________

/// output grid

int x = 0;                  // coordinate x
int y = 0;                  // coordiante y
int Dx = 0;                 // horizontal position 
int Dy = 0;                 // vertical position
int b = 0;                  // interpolated density
std::vector <float> D;      // stores the interpolated values


    cout << "number of columns of the new file?" << endl;       // specifying number of columns
    cin  >> x;
    cout << endl;
    cout << "number of lines of the new file?" << endl;         // specifying number of lines
    cin  >> y;
    cout << endl;

}

/// DIAGRAM OF A CELL WITH THE POSITION OF: b (u,v)

//__________________________________________________
//
//      D1 ---u--- D2
//       |    |     |
//       v----b     |
//       |          |
//      D3 ------- D4
//
//__________________________________________________


int D1 = 0;         // densities of the four points of the cell containing (x,y)
int D2 = 0;
int D3 = 0;
int D4 = 0;

float u = 0;        // horizontal and vertical positions of b within the cell
float v = 0;



//_______________________________________________________________________
/// PART MISSING HERE: HOW TO GET D1, D2, D3, D4, u, v ???
//_______________________________________________________________________


        while (x<C, y<L)    {
                                                // formulae for bilinear interpolation
        double DL = D1 - D1 * v + D3 * v;       // Vertical linear interpolation right side
        double DR = D2 - D2 * v + D4 * v;       // Vertical linear interpolation left side
        double D  = DL - DL * u + DR * u;       // Horizontal linear interpolation

        D.push_back (b);

        x++;                // next interpolation

            if (x>C) {

                y = y++;
            }
        }

}
4

0 に答える 0