2013-05-13 3 views
4

Дано:Расщепление 2D массив в массив небольших 2D массивов в C

1 2 3 4 5 6 7 8 
1 2 3 4 5 6 7 8 
1 2 3 4 5 6 7 8 

Я хочу, чтобы разделить 2d массив (структура матрицы) в массив структур MATRIX дано chunksize CS: предположим, CS быть 2, ответ будет

Seg[0]: 
1 2 
1 2 
1 2 
Seg[1]: 
3 4 
3 4 
3 4 
.... 
Seg[3]: 
7 8 
7 8 
7 8 

Вот мой Матрица Struct:

typedef struct MATRIX { 
    int nrow; 
    int ncol; 
    int **element; 
} MATRIX; 

и здесь функция в отделяет им:

void SegmentMatrix(MATRIX input,MATRIX* segs,int Chunksize, int p) { 
    int i,j,r; 

    //Allocate segs 
    for (i = 0; i<p;i++) 
    { 
     CreateMatrix(&(segs[i]),input.nrow ,Chunksize,0); 
    } 

    //Now Copy the elements from input to the segs 
    //where seg0 takes from 0 to cs cols of a, and all their rows, and seg1 takes from cs to 2cs ... 
    printf("Stats:\n\t P: %d\t CS: %d\n",p,Chunksize); 
    for (r = 0; r<p; r++) { 
     for (i = 0; i<input.nrow;i++) { 
      for (j = r*Chunksize; j<r*Chunksize+Chunksize-1; j++) { 
       //I tried (&(segs[r]))->element... Doesn't work, produces wrong data 
       segs[r].element[i][j] = input.element[i][j]; 

     } 
    } 
    PRINTM(segs[r]); 
    } 


} 

Обратите внимание, что PRINTM в основном печатает матрицу, она знает пределов, проверяя Segs [г] .nrow и Ncol и CreateMatrix принимает следующие входы (& матрица, количество строк, количество колонок, filltype) и mallocs изнутри.

filltype: 
0- generates zeroth matrix 
1- generates identity 
else A[i][j] = j; for simplicity 

Проблема заключается в том, что если я печатать матрицы Segs [я], все они сводятся с их значения по умолчанию задается CreateMatrix, а не вновь добавленных стоимостей.

ОК, так что если вы, ребята, проверите этот последний PRINTM в функции SegmentMatrix, он выведет матрицы, как если бы петли не произошли, ака, я могу удалить циклы for и получить тот же результат. . сделал я что-то неправильно в этой строке (взято из SegmentMatrix)

Segs[r].element[i][j] = input.element[i][j]; 
+0

Где бы вы поделили свой призыв к PRINTM, чтобы отобразить ошибочный ввод? Я хотел бы видеть, что в вашем вышеуказанном коде вызвали код, чтобы убедиться, что это не тележка перед проблемой типа лошади. –

+0

Если вы посмотрите на последний оператор в SegmentMatrix, вы увидите PRINTM, он отобразит значения по умолчанию для segs, как будто целое для циклов не произошло. – zellwwf

+0

@MichaelDorgan надеется, что это объясняет. – zellwwf

ответ

5

Я не понимаю, почему и что вы манипулируете с умножением на ChunkSize и r (который неинициализированный в любом случае), я бы предложил упростить код (эмпирическое правило: если он кажется грязным, это слишком сложно). Все, что вам нужно, это 3-мерный массив для хранения массива кусков, и по модулю арифметика плюс целочисленное деление, чтобы вставить в соответствующую колонку соответствующего фрагмента:

/* the variable-sized dimension of the `chunks' argument is w/chsz elements big 
* (it's the number of chunks) 
*/ 
void split(int h, int w, int mat[h][w], int chsz, int chunks[][h][chsz]) 
{ 
    /* go through each row */ 
    for (int i = 0; i < h; i++) { 
     /* and in each row, go through each column */ 
     for (int j = 0; j < w; j++) { 
      /* and for each column, find which chunk it goes in 
      * (that's j/chsz), and put it into the proper row 
      * (which is j % chsz) 
      */ 
      chunks[j/chsz][i][j % chsz] = mat[i][j]; 
     } 
    } 
} 

Демонстрация, а. к. а. как это называется:

int main(int agrc, char *argv[]) 
{ 
    const size_t w = 8; 
    const size_t h = 3; 
    const size_t c = 2; 

    int mat[h][w] = { 
     { 1, 2, 3, 4, 5, 6, 7, 8 }, 
     { 1, 2, 3, 4, 5, 6, 7, 8 }, 
     { 1, 2, 3, 4, 5, 6, 7, 8 } 
    }; 

    int chunks[w/c][h][c]; 

    split(h, w, mat, c, chunks); 

    for (int i = 0; i < w/c; i++) { 
     for (int j = 0; j < h; j++) { 
      for (int k = 0; k < c; k++) { 
       printf("%3d ", chunks[i][j][k]); 
      } 
      printf("\n"); 
     } 
     printf("\n\n"); 
    } 

    return 0; 
} 
+1

+1 Думаю, он должен принять ваш ответ. я слишком устал, чтобы проверить его код. так просто написал мой псевдокод – qwr

+0

@QWR Спасибо. – 2013-05-13 19:44:06

+0

Спасибо, ребята ...я посмотрю на него и отвечу как можно скорее, но структуры будут содержать счетчик размера матрицы на всякий случай. – zellwwf

2

Вопрос был неясен. поэтому я подумал, что он хочет просто знать, как этого добиться. Итак, я написал этот простой псевдокод. В противном случае примите мои извиниться:

matrix[i] matrix 
//matrixes total column size should be bigger big 2d array column size 
first condition check: sum(matrix[i].colsize)>=big2d.colsize 
//in this simple code raw sizes must be equal 
second condition: for all i matrix[i].rawsize=big2d.rawsize 
//if columns sizes will be equal the algorithm could be simplified , does not mean optimized 
//splitting big2d into matrixes 
for (int br=0;br<big2d.rawsize;br++){ 
i=0;//store matrix index 
int previndex=0;//store offset for next matrix 
    for(int bc=0;bc<big2d.colsize;bc++){ 

     matrix[i].val[bc-previndex][br]=big2d.val[bc][br]; //assign (bc,br) 

     if(bc-previndex==matrix[i].colsize-1){ 
      i++; //move to next matrix;//if we not have next matrix then break; 
      previndex=bc+1; 
      } 
    /*if it be for equal chunks matrixes offset can be calculated this way too 
     matrix[bc/chunk].val[bc%chunk][br]=big2d.val[bc][br]; 
     */ 
    }//loop columns 
}//loop raws 
+1

Пожалуйста, добавьте несколько комментариев точно что делает ваш код. Это не ясно само по себе ... –

Смежные вопросы