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
任意の位置を簡単に定義するにはどうすればよいですか?L
density
D1, D2, D3, D4
そして、セル内で、ポイントによって定義された(D1, D2, D3, D4)
位置を定義するにはどうすればよいですか(ポイントを理解するためのコードを参照してください)。(u,v)
d
d
コードの改善にご協力いただければ... :) ありがとうございます!
///
概念化を容易にするために、数値を使用した例を次に示します。
入力.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
に等しい3
、x
に等しい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 > 0
とv = 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++;
}
}
}