我有一个尺寸为N乘N的矩阵。
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 :(得分: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");
}
}