• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > 学习二维动态数组指针做矩阵运算的方法

学习二维动态数组指针做矩阵运算的方法

作者:王维来 字体:[增加 减小] 来源:互联网 时间:2017-05-28

王维来 通过本文主要向大家介绍了学习二维动态数组指针做矩阵运算的方法等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

本文分享了利用二维动态数组指针做矩阵运算的实现代码。

1. 头文件    

// juzhen 2.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include "stdlib.h"
#include "windows.h"
#define OK 0
#define NG -1
typedef struct mat
{
int nRow;     /* 行数        */
int nCol;     /* 列数        */
int* pData;    /* 指向矩??体的指? */
}MAT;
</div>

2. 程序代码    

#include "stdafx.h"
#include "Matrix_cal.h"
/* Entity and initial matrix of the application matrix function */
int MATAlloc(MAT *pMat, int nRow, int nCol)
{
  pMat->pData = (int *) malloc (nRow * nCol * sizeof(int) );
  if(NULL == pMat->pData)
  {
    printf("Memary is error!\n");
    return NG;
  }
  for(int i=0; i<nRow; ++i)
  {
    for(int j=0; j<nCol; ++j)
    {
      *(pMat->pData + i*nCol + j)=0;
    }
  }
  pMat->nRow = nRow;
  pMat->nCol = nCol;
  return OK;
}
 
/* Release the memory space and reset the matrix data function */
void MATFree(MAT* pMat)
{
  free(pMat->pData);
  pMat->pData = NULL;
  pMat->nRow = 0;
  pMat->nCol = 0;
}
 
/* Import of matrix function */
int MATAssign (MAT* pMat1, const MAT* pMat2)
{
  MATAlloc(pMat1, pMat2->nRow, pMat2->nCol);
  for(int i=0; i < pMat1->nRow; ++i)
  {
    for(int j=0; j < pMat1->nCol; ++j)
    {
      *(pMat1->pData + i * pMat1->nCol + j) = *(pMat2->pData + i * pMat1->nCol + j);
    }
  }
  return OK;   
}
 
/* Matrix sum function */
int MATAdd(const MAT* pMat1, const MAT* pMat2, MAT* pMat3)
{
  MATAlloc(pMat3, pMat1->nRow, pMat1->nCol);
  if((pMat1->nRow == pMat2->nRow) && (pMat1->nCol == pMat2->nCol))
  {
    for(int i=0; i<pMat1->nRow; ++i)
    {
      for(int j=0; j<pMat1->nCol; ++j)
      {
        *(pMat3->pData + i * pMat3->nCol + j) = *(pMat1->pData + i * pMat1->nCol + j) + *(pMat2->pData + i * pMat1->nCol + j);
      }
    }
    return OK;   
  }
  else
  {
    printf("Not add!\n");
    return NG;
  }
 
}
 
/* Matrix subtraction function */
int MATSub(const MAT* pMat1, const MAT* pMat2, MAT* pMat3)
{
  MATAlloc(pMat3, pMat1->nRow, pMat1->nCol);
  if((pMat1->nRow == pMat2->nRow) && (pMat1->nCol == pMat2->nCol))
  {
    for(int i=0; i<pMat1->nRow; ++i)
    {
      for(int j=0; j<pMat1->nCol; ++j)
      {
        *(pMat3->pData + i * pMat3->nCol + j) = *(pMat1->pData + i * pMat1->nCol + j) - *(pMat2->pData + i * pMat1->nCol + j);
      }
    }
    return OK;   
  }
  else
  {
    printf("Not Sub!\n");
    return NG;
  }
 
}
 
/* Matrix clear */
void MATClear(MAT* pMat)
{
  for(int i=0; i<pMat->nRow; ++i)
  {
    for(int j=0; j<pMat->nCol; ++j)
    {
      *(pMat->pData + i * pMat->nCol + j)=0;
    }
  }
}
 
/* Matrix multiplication C function */
void MATMulC (MAT* pMat, int C)
{
  for(int i=0; i<pMat->nRow; ++i)
  {
    for(int j=0; j<pMat->nCol; ++j)
    {
      *(pMat->pData + i * pMat->nCol + j) = C * (*(pMat->pData + i * pMat->nCol + j) );
    }
  }
}
 
/* Matrix multiplication function */
int MATMul (const MAT* pMat1, const MAT* pMat2, MAT* pMat3)
{
  MATAlloc(pMat3, pMat1->nRow, pMat2->nCol);
  if(pMat1->nCol == pMat2->nRow)
  {
    for(int i=0; i<pMat1->nRow; ++i)
    {
      for(int j=0; j<pMat2->nCol; ++j)
      {
        for(int k=0; k<pMat1->nCol; ++k)
        {
          *(pMat3->pData + i * pMat2->nCol+j) += *(pMat1->pData + i * pMat2->nRow + k) * (*(pMat2->pData + k * pMat2->nCol + j) );
        }
      }
    }
    return OK;   
  }
  else
  {
    printf("not Mul\n");
    return NG;
  }
}
/* Matrix transpose function */
int MATTransport(const MAT* pMat1, MAT* pMat2)
{
  MATAlloc(pMat2, pMat1->nCol, pMat1->nRow);
  for(int i=0; i<pMat1->nRow; ++i)
    {
      for(int j=0; j<pMat1->nCol; ++j)
      {
        *(pMat2->pData + j * pMat1->nRow + i) = *(pMat1->pData + i * pMat1->nCol + j);
      }
    }
  return OK;
}
/*
bool Check_digit(char *kk)
{
  int a = strlen(kk);
  for(int i = 0; i<a; ++i)
  {
    if( ( (int) (*(kk + i) ) > 48) && ( (int) (*(kk + i) ) < 57 || (int) (*(kk + i) ) == 32) )
    {
      return 1;
    }
  }
  return 0;
}
 
*/
 
/* Matrix initialization */
void MATinit(MAT *pMat)
{
  bool kos=1;
  int nRow = 0, nCol = 0;
  printf("Please input the number of rows: ");
  scanf_s("%d",&nRow);
  putchar('\n');
  printf("Please input the number of columns: ");
  scanf_s("%d",&nCol);
  putchar('\n');
  printf("Please input %dX%d Matrix:\n",nRow,nCol);
  kos=MATAlloc(pMat,nRow,nCol);
  for(int i=0; i<nRow; ++i)
  {
    for(int j=0; j<nCol; ++j)
    {
      scanf("%d", pMat->pData + i*nCol + j);
    }
  }
}
  /*char arr[100][100]={0};
  for(int i=0; i<nRow; ++i)
  {
    for(int j=0; j<nCol; ++j)
    {
      scanf("%c", &arr[i][j]);
      kos = Check_digit(&arr[i][j]);
    }
  }
  //ks= atoi(arr[0]);
  while(kos)
  {
    printf(" input is error,Please input again!");
    for(int i=0; i<nRow; ++i)
    {
      for(int j=0; j<nCol; ++j)
      {
        scanf("%c", arr[i]);
      }
    }
    kos = Check_digit(arr[0]);
    //ks= atoi(arr[0]);
  }
  for(int i=0; i<nRow; ++i)
  {
    for(int j=0; j<nCol; ++j)
    {
      *(pMat->pData + i*nCol + j) = atoi(&arr[i][j]);
    }
  }
 
}
*/
 
/* Output matrix */
void Print(MAT *pMat)
{
  printf("The result is:\n");
  for(int i = 0; i < pMat->nRow; ++i)
  {
    for(int j=0; j<pMat->nCol; ++j)
    {
      printf("%d ",*( pMat->pData + i * pMat->nCol + j) );
    }
    putchar('\n');
  }
}
 
int _tmain(int argc, _TCHAR* argv[])
{
  int nRow = 1,nCol = 1,sign = 1,C = 1,work = 1,sigal=0;
  MAT Mat, Mat1, Mat2;
  MAT *pMat = &Mat;
  MAT *pMat1 = &Mat1;
  MAT *pMat2 = &Mat2;
  while(work)
  {
    system("cls");
    printf("           Welcome To The Matrix Operation system!   \n");
    printf("------------------------------------------------\n");
    printf("1: Open The Generating matrix function!\n");
    printf("2: Open The Release matrix function!\n");
    printf("3: Open The Import matrix function!\n");
    printf("4: Open The Add matrix function!\n");
    printf("5: Open The Matrix subtraction function!\n");
    printf("6: Open The Clear matrix function!\n");
    printf("7: Open The Matrix multiplication C function!\n");
    printf("8: Open The Matrix multiplication function!\n");
    printf("9: Open The Matrix transpose function!\n");
    printf("------------------------------------------------\n");
    printf("Please Select operation type:");
    scanf("%d",&sign);
    switch(sign)
    {
      case 1:
      {
       MATinit(pMat);
       Print(pMat);
      }
      break;
      case 2:
      {
        MATinit(pMat);
        Print(pMat);
        MATFree(pMat);
      }
      break;
      case 3:
      {
       
        MATinit(pMat2);
        MATAssign (pMat1, pMat2);
        Print(pMat1);
      }
      break;
      case 4:
      {
        MATinit(pMat1);
        MATinit(pMat2);
        sigal = MATAdd(pMat1, pMat2,pMat);
        if(0 == sigal)
        {
          Print(pMat);
        }
      }
      break;
      case 5:
      {
        MATinit(pMat1);
        MATinit(pMat2);
        sigal = MATSub(pMat1, pMat2,pMat);
        if(0 == sigal)
        {
          Print(pMat);
        }
      }
      break;
      case 6:
      {
        MATinit(pMat);
        Print(pMat);
        MATClear(pMat);
    



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

相关文章

  • 2017-05-28c语言实现把文件中数据读取并存到数组中
  • 2017-05-28C语言中计算二叉树的宽度的两种方式
  • 2017-05-28C语言格式化输入输出函数详解
  • 2017-05-28C语言new操作的安全性分析
  • 2017-05-28C语言中一些将字符串转换为数字的函数小结
  • 2017-05-28解析C++的线性表链式存储设计与相关的API实现
  • 2017-05-28解析C++中的虚拟函数及其静态类型和动态类型
  • 2017-05-28C字符串与C++字符串的深入理解
  • 2017-05-28C++ 在堆上开辟与释放二维、三维指针详细解析
  • 2017-05-28C++实现读取特定路径下文件夹及文件名的方法

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 详解C++编程中的静态成员与可变数据成员
    • 简要对比C语言中的truncate()函数与ftruncate()函数
    • C语言解决螺旋矩阵算法问题的代码示例
    • C语言中的abs()函数和exp()函数的用法
    • C++中访问字符串的三种方法总结
    • C++详解默认参数的构造函数及简单实例代码
    • 在vs2010中,输出当前文件路径与源文件当前行号的解决方法
    • C语言中使用快速排序算法对元素排序的实例详解
    • C++中用substr()函数消除前后空格的解决方法详解
    • Linux下g++编译与使用静态库和动态库的方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有