2015-09-03 84 views
-3

我的尺寸N A矩陣由N如何在C中填充和取消填充零點的二維矩陣?

Ex: 1 2 3 
    4 5 6 
    7 8 9 

我需要N + 2由N + 2以獲得尺寸的矩陣。

Ex O/P - 0 0 0 0 0 
      0 1 2 3 0 
      0 4 5 6 0 
      0 7 8 9 0 
      0 0 0 0 0 

然後我還需要能夠提取實際的矩陣,如果只給予填充矩陣。我怎樣才能做到這一點?

+0

我懷疑這是C代碼。請發佈[mcve]。 – Olaf

+2

「你試過什麼?」的常見評論... – nafas

回答

1

使用指針和指針數學很容易實現這一點。 我會假設你已經有權訪問矩陣維度。

下面的代碼允許你填充和去填充你的矩陣。我已經測試過不同的矩陣大小,所以它應該可以與任何方形矩陣一起工作:

#include <stdio.h> 
#include <stdlib.h> 

void pad(int *s,int *d,int dim); 
void depad(int *s,int *d,int dim); 
void prnt(int *s,int dim); 

int main(void) 
{ 
    int v[3][3]={{1,2,3},{4,5,6},{7,8,9}}; //example matrix 
    int dim=3; //get dimension from program 
    int *t; 
    int *dpad; 

    //mem alloc 
    t = (int*) calloc((dim+2)*(dim+2),sizeof(int)); 
    dpad = (int*) calloc(dim*dim,sizeof(int)); 

    //-------------------------------------------- 
    printf("Initial matrix:\n"); 
    prnt(*v,dim); 

    //-------------------------------------------- 
    printf("Padded matrix:\n"); 
    pad(*v,t,dim); 
    prnt(t,dim+2); 

    //-------------------------------------------- 
    printf("Depadded matrix:\n"); 
    depad(t,dpad,dim+2); 
    prnt(dpad,dim); 

    //free mem and return 
    free(t); 
    free(dpad); 
    return 0; 
} 

void pad(int *s,int*d,int dim) 
{ 
    int i,j; 
    for(i=0;i<dim;i++) 
     for(j=0;j<dim;j++) 
      *(d+(i*(dim+2)+(dim+3+j)))=*(s+i*dim+j); 
} 

void depad(int *s,int *d,int dim) 
{ 
    int i,j; 
    dim=dim-2; 
    for(i=0;i<dim;i++) 
     for(j=0;j<dim;j++) 
      *(d+i*dim+j)=*(s+(i*(dim+2)+(dim+3+j))); 
} 

void prnt(int *s,int dim) 
{ 
    int i,j; 
    for(i=0;i<dim;i++) 
    { 
     for(j=0;j<dim;j++) printf("%d ",*(s+dim*i+j)); 
     printf("\n"); 
    } 
}