C实验室中用于矩阵的2Darrays

这是对2Darrays的上述问题的概括。 在video压缩中,这被称为运动估计。 video被分成帧,每帧被分成块(例如,帧可以是1000×1000,块是10×10)。 这意味着每帧都是10,000个块。 如果我知道当前帧中的块号x在下一帧中移动到位置y,那么我将发送“移动到Y”而不是发送“移动到Y”,这比整个块少得多。 关键是要计算Y(或YX是准确的)。

考虑上面的图片,其示出了帧M×N和两个子块,一个子块的左上角为(i1,j1),第二个子块为(i2,j2)。 第二块是第一块在i方向上由i2-i1和在j方向上的j2-j2的平移。 这些块之间的区别是(有很多方法可以计算它,我们将使用最简单的方法,即绝对误差的总和。

k−1 k−1 Δ=∑∑∣ x[i+i1][ j+ j1]−x[i+i2][ j+ j2] ∣. i=0 j=0 

现在这是如何工作的?

从第一个块开始(i1,j1)通过在垂直方向和水平方向上移动该块来查找具有最小距离的块。 首先,我们将块在i方向上从i1-δ移动到i1 +δ,并且在j方向上从j1-δ移动到j1 +δ,其中δ的范围是1→z。 如果z为3,则我们考虑垂直和水平方向的-3,-2,-1,1,2,3,总共36个不同的块。 我们计算原始块和这36个块之间的差异,我们选择具有最小距离的块。

在本实验中,您将获得帧大小(M,N),块大小(k),块位置(i1,j1)和搜索的最大距离(z)。 使用指定距离的最小差值计算块。

输入文件

 MN k z i1 j1 matrix size M-by-N row by row 

产量

 i2-i1 j2-j1 difference. 

 8 8 3 2 2 1 1 2 3 4 5 6 7 8 9 10 11 12 3 4 5 6 7 8 ... (64 elements) 

这是我目前的代码

 #include  Int difference(int b[][], int M, int N) { int temp = 0, i; j; for(i =0;i<N;i++) { for(j=0;j<M;j++){ temp += ((b[i + i1][j+j1]) - (b[i + i2][j+j2])); // square it???? } } return temp; } int main() { int M, int N, int k, int z, int i1, int j1, b // initialize ints int b[N][M]; // universe double array int jj, ii; // for incrementing int i2,j2; int value = INT_MAX; // max value possible int saveRotation; // direction int saveEnd; // lowest scanf("%d", &M); // store M length scanf("%d", &N); // store N length scanf("%d", &k); // store k block size scanf("%d", &z); // store max search movement scanf("%d", &i); // store i location (y) scanf("%d", &j); // store j location (x) for(ii=0; ii < N; ii++) { for(jj=0; jj < M; jj++) { // putting double array values into defined array length scanf("%d, &a[ii][jj]) // storing } } int c1[k-1][k-1], c2[k-1][k-1]; // size of 2 sub arrays c1[0][0] = a[i][j]; // setting block to chosen start 0 value for(ii=1; ii < k+1; ii++){ for(jj=1; jj < k+1; jj++) { // creating the first sub double array c1[ii][jj] = a[i][j]; } } for(ii=0; ii < N; ii++) { // first loop for(jj=0; jj difference(b[][], M, N)) { value = difference(a[][], M, N); save_rotation = ii * jj; // potential lowest difference ??? } // NEED TO USE THE Z VALUE FOR POSSIBLE SHIFTS THAT RESULT IN LOWEST DIFFERENCE } } int saveI, saveJ; saveI = i2 - i1; saveJ = j2 - j1; printf("Output"); printf("%d \n",saveI + saveJ); printf("%d \n",save_rotation); return 0; }