Минимальный сдвиг вектора для минимизации разности с другим вектором в C

Рассмотрим приведенное выше изображение, которое показывает кадр M x N и два подблока, один субблок с его верхним левым углом в i1, j1, а второй – в i2, j2. Второй блок представляет собой перенос первого блока на i2-i1 в направлении i и j2-j2 в направлении j. Разница между этими блоками (есть много способов рассчитать это, мы будем использовать самый простой, который является суммой абсолютных ошибок.

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 элемента)

или же

Входные данные:

 7 7 2 2 3 2 36 85 56 20 3 23 81 8 20 72 88 89 83 56 59 0 19 19 43 31 20 22 35 50 6 81 17 46 72 17 83 11 87 0 12 3 68 67 50 96 14 3 37 20 90 36 41 51 23 

выход равен -1,2 (разность = 40)

 #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; } 

Как вы находите самую низкую разницу смещения Z