栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

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;

2. 程序代码    

#include "stdafx.h"
#include "Matrix_cal.h"

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; ipData + i*nCol + j)=0;
    }
  }
  pMat->nRow = nRow;
  pMat->nCol = nCol;
  return OK;
}
 

void MATFree(MAT* pMat)
{
  free(pMat->pData);
  pMat->pData = NULL;
  pMat->nRow = 0;
  pMat->nCol = 0;
}
 

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;   
}
 

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; inRow; ++i)
    {
      for(int j=0; jnCol; ++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;
  }
 
}
 

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; inRow; ++i)
    {
      for(int j=0; jnCol; ++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;
  }
 
}
 

void MATClear(MAT* pMat)
{
  for(int i=0; inRow; ++i)
  {
    for(int j=0; jnCol; ++j)
    {
      *(pMat->pData + i * pMat->nCol + j)=0;
    }
  }
}
 

void MATMulC (MAT* pMat, int C)
{
  for(int i=0; inRow; ++i)
  {
    for(int j=0; jnCol; ++j)
    {
      *(pMat->pData + i * pMat->nCol + j) = C * (*(pMat->pData + i * pMat->nCol + j) );
    }
  }
}
 

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; inRow; ++i)
    {
      for(int j=0; jnCol; ++j)
      {
 for(int k=0; knCol; ++k)
 {
   *(pMat3->pData + i * pMat2->nCol+j) += *(pMat1->pData + i * pMat2->nRow + k) * (*(pMat2->pData + k * pMat2->nCol + j) );
 }
      }
    }
    return OK;   
  }
  else
  {
    printf("not Muln");
    return NG;
  }
}

int MATTransport(const MAT* pMat1, MAT* pMat2)
{
  MATAlloc(pMat2, pMat1->nCol, pMat1->nRow);
  for(int i=0; inRow; ++i)
    {
      for(int j=0; jnCol; ++j)
      {
 *(pMat2->pData + j * pMat1->nRow + i) = *(pMat1->pData + i * pMat1->nCol + j);
      }
    }
  return OK;
}

 

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; ipData + i*nCol + j);
    }
  }
}
  
 

void Print(MAT *pMat)
{
  printf("The result is:n");
  for(int i = 0; i < pMat->nRow; ++i)
  {
    for(int j=0; jnCol; ++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);
 Print(pMat);
      }
      break;
      case 7:
      {
 printf("Please input the number of C: ");
 scanf("%d",&C);
 putchar('n');
 MATinit(pMat);
 MATMulC (pMat, C);
 Print(pMat);
      }
      break;
      case 8:
      {
 MATinit(pMat1);
 MATinit(pMat2);
 sigal = MATMul (pMat1, pMat2, pMat);
 if(0 == sigal)
 {
   Print(pMat);
 }
      }
      break;
      case 9:
      {
 MATinit(pMat1);
 MATTransport(pMat1, pMat2);
 Print(pMat2);
      }
      break;
      default: printf("input is error!");
    }
    printf("Whether exit the Matrix calculation system?(1 is not exit,0 is exit)n");    //whether exit the system.
    scanf("%d", &work);
    fflush(stdin);
    while (work != 0 && work != 1) //work must is 1 or 0.
    {
      printf(" Input is error,Please input again!n");
      scanf("%d", &work);
      fflush(stdin);
    }
  }
  printf("n-------------Thanks For You Using The Matrix Calculation System !--------------n");
  Sleep(2000);     //deley some times.
  return 0;
}


以上就是实现二维动态数组指针做矩阵运算的代码,希望对大家的学习有所帮助。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/65016.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号