waightman的个人博客分享 http://blog.sciencenet.cn/u/waightman

博文

C语言中动态二维数组的使用和分配

已有 2683 次阅读 2015-8-29 14:07 |个人分类:C数值计算|系统分类:科研笔记| C语言数值计算

好多年不用C语言了,最后一次使用还是读研的时候写矩量法的时候了,看见VS的界面总能想起当年读书的时候的各种错误,往事随风。本程序应人之约,首先得到一个随机的矩阵,之后通过将矩阵分解为几个小矩阵统计小矩阵的所有元素的和,最终得到一个新的矩阵,其中涉及动态二维数组的分配,多维数组的使用按照这个方式类推。一维数组相当于矢量,二维数组相当于矩阵,高维数组可以用张量来理解。在数值计算中应该会遇到


#include<stdio.h>

#include<math.h>

#include <malloc.h>

#include<stdlib.h>

//作者Waightman H Wang

#define Ohang 14     //初始矩阵大小

#define Olie 14

#define RATE 5     //压缩率

int main()

{

//根据压缩率判断压缩后的矩阵大小


double input[Ohang][Olie];

int Lhang,hangyu,Llie,lieyu,ii;


Lhang=Ohang/RATE;

hangyu=Ohang%RATE;

Llie=Olie/RATE;

lieyu=Olie%RATE;

if(hangyu>3)

Lhang=Lhang+1;

if(lieyu>3)

Llie=Llie+1;



double **output;

output = (double **)malloc(sizeof(double*)*Lhang);//申请一组一维指针空间。

   for(ii = 0; ii < Llie; ii ++)

       output[ii] = (double *)malloc(sizeof(double) * Llie); //对于每个一维指针,申请一行数据的空间。


    if (output == 0)             // 内存申请失败,提示退出

    {

        printf("out of memory,press any key to quit...n");

        exit(0);             // 终止程序运行,返回操作系统

    }


int i = 0, j = 0, oi = 0, oj = 0;


srand(1);

for (i = 0; i < Ohang; i++)

for (j = 0; j < Olie; j++)

input[i][j] = rand()%10;



//计算新矩阵的元素

double sum = 0.0;//小矩阵求和存储

           int sum_count = 0;//非零元个数

int hangtemp,lietemp;//分块矩阵的临时角标

for(oi=0;oi<Lhang-1;oi++)

{

for(oj=0;oj<Llie-1;oj++)

{

sum = 0.0;//小矩阵求和存储

           sum_count = 0;//非零元个数

hangtemp=oi*RATE;

lietemp=oj*RATE;

for(i=0;i<RATE;i++)

for(j=0;j<RATE;j++)

{

sum=sum+input[hangtemp+i][lietemp+j];

}

//输出矩阵的填充

output[oi][oj]=sum;

}

}





//最后一行可能填不满,单独处理

int RATEH,RATEL;

if(hangyu>3)

RATEH=hangyu;

else

RATEH=RATE;


hangtemp=RATE*(Lhang-1);

for(oj=0;oj<Llie-1;oj++)

{

sum = 0.0;//小矩阵求和存储

           sum_count = 0;//非零元个数

lietemp=oj*RATE;

for(i=0;i<RATEH;i++)

for(j=0;j<RATE;j++)

{

sum=sum+input[hangtemp+i][lietemp+j];

}

//输出矩阵的填充

output[Lhang-1][oj]=sum;

}



//最后一列的处理

if(lieyu>3)

RATEL=lieyu;

else

RATEL=Olie-lieyu;




lietemp=RATE*(Llie-1);


for(oi=0;oi<Llie-1;oi++)

{

sum = 0.0;//小矩阵求和存储

          sum_count = 0;//非零元个数

hangtemp=oi*RATE;

for(i=0;i<RATE;i++)

for(j=0;j<RATEL;j++)

{

sum=sum+input[hangtemp+i][lietemp+j];

}

//输出矩阵的填充

output[oi][Llie-1]=sum;

}


//最后右下角元素


hangtemp=oi*RATE;

lietemp=oi*RATE;

sum=0;

for(i=0;i<RATEH;i++)

for(j=0;j<RATEL;j++)

{  

sum=sum+input[hangtemp+i][lietemp+j];

}

//输出矩阵的填充

output[Lhang-1][Llie-1]=sum;

for (i = 0; i < Ohang; i++)

{

for (j = 0; j <Olie; j++)

printf("%f ", input[i][j]);

printf("n");

}


for (i = 0; i < Lhang; i++)

{

for (j = 0; j < Llie; j++)

printf("%f ", output[i][j]);

printf("n");

}

system("pause");

return 0;

}




https://blog.sciencenet.cn/blog-1218015-916857.html


下一篇:基于CST海面背景耦合下目标电磁散射特性仿真分析
收藏 IP: 219.142.87.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-5-27 04:44

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部