我需要的數據結構,用於在均勻採樣的3D網格存儲浮點值:自適應「均勻」網格的數據結構和算法?
X = X0 + IX * DX其中0 < = IX < NX
Y = Y0 + IY * DY其中0 < = IY <紐約
Z = Z0 + IZ * DZ其中0 < = IZ < NZ
到現在爲止我已經用我的Array類:
Array3D<float> A(nx, ny,nz);
A(0,0,0) = 0.0f; // ix = iy = iz = 0
它在內部將float值存儲爲具有nx * ny * nz個元素的1D數組。
但是現在我需要表示一個具有比我有更多數值的網格,例如 nx = ny = nz = 2000.
我認爲這樣一個網格中的很多鄰居節點可能有相似的值,所以我想如果有一些簡單的方法可以自適應地「粗化」網格。例如,如果該網格中的單元格的8個(ix,iy,iz)節點的值相距小於5%,則該網格中的單元格的8個節點(ix,iy,它們被「移除」並被一個值取代; 8個值的平均值。
我該如何以簡單高效的方式實現這樣的數據結構?編輯: 謝謝Ante建議有損壓縮。我想這可能是工作方式如下:
#define BLOCK_SIZE 64
struct CompressedArray3D {
CompressedArray3D(int ni, int nj, int nk) {
NI = ni/BLOCK_SIZE + 1;
NJ = nj/BLOCK_SIZE + 1;
NK = nk/BLOCK_SIZE + 1;
blocks = new float*[NI*NJ*NK];
compressedSize = new unsigned int[NI*NJ*NK];
}
void setBlock(int I, int J, int K, float values[BLOCK_SIZE][BLOCK_SIZE][BLOCK_SIZE]) {
unsigned int csize;
blocks[I*NJ*NK + J*NK + K] = compress(values, csize);
compressedSize[I*NJ*NK + J*NK + K] = csize;
}
float getValue(int i, int j, int k) {
int I = i/BLOCK_SIZE;
int J = j/BLOCK_SIZE;
int K = k/BLOCK_SIZE;
int ii = i - I*BLOCK_SIZE;
int jj = j - J*BLOCK_SIZE;
int kk = k - K*BLOCK_SIZE;
float *compressedBlock = blocks[I*NJ*NK + J*NK + K];
unsigned int csize = compressedSize[I*NJ*NK + J*NK + K];
float values[BLOCK_SIZE][BLOCK_SIZE][BLOCK_SIZE];
decompress(compressedBlock, csize, values);
return values[ii][jj][kk];
}
// number of blocks:
int NI, NJ, NK;
// number of samples:
int ni, nj, nk;
float** blocks;
unsigned int* compressedSize;
};
對於這是我需要一種有損壓縮是有用的:
- 速度極快,還對小數據集(如64x64x64)
- 壓縮很難> 3倍,不用擔心它是否會泄漏一些信息。
任何好的應聘者?
聽起來像3D數據的有損壓縮。也許圖層可以視爲圖像並獨立壓縮(例如jpg),甚至可以將一個座標視爲時間並將數據視爲視頻。我不確定,但可能這些方法在查詢數據方面效率不高,因爲我認爲它們不適用於本地。 – Ante 2013-02-14 08:59:41
相似主題:http:// arxiv。組織/ ABS/1303.0270 – Ante 2013-03-04 08:22:57