用C++语言实现动态版的矩阵乘法

用C++语言实现动态版的矩阵乘法,第1张

#include <iostream.h>

class Matrix

{

      double *data

      int r, c

      public:

      Matrix(int rr, int cc)

      {

          r = rr c = cc

         data = new double [r*c] 

         memset(data, 0, r*c*sizeof(double))    

      }

      double get(int i, int j)

      {

             if (i >= r || j >= c) return 0

             return data[i * c + j]

      }

      void set(int i, int j, double d)

      {

             if (i >= r || j >= c) return

             data[i * c + j] = d

      }

      void assign(double *d, int s)

      {

           if (d == 0 || s != r * c) return 

            memcpy(data, d, s*sizeof(double))

   升埋和   }

      Matrix* mul(Matrix &b)

      {

              if (c != b.r) return 0

              Matrix* res = new Matrix(r, b.c)

              int i, j, k

              for (i = 0 i < r i++)

                  for (j = 0 j < c j++)

                    for (k  = 0 k < b.r k++)

                        res->data[i*b.c+k] += data[i*c+j] * b.data[j*b.c + k]

              return res

      }

      void print()

      {

           int i, j

           cout <<  " ================" <<endl

            for (i = 0 i < r i++)

     液枝       {

                  for (j = 0 j < c j++) cout << data[i*c + j] << " 吵盯"

                  cout << endl

            }

                  

      }

      ~Matrix()

      {

               delete data

      } 

}

int main()

{

    double a[] = {1, 2, 3, 4}

    double b[] = {1, 2, 3, 4}

    cout << "let us go !!!!\n"

    Matrix m(2,2), n(2,2)

    m.assign(a, 4)

    n.assign(b, 4)

    m.print()

    n.print()

    Matrix* c = m.mul(n)

    c->print()

    delete c

    return 0

}

上如棚面那个程序是我写的,下面写的是两个2*2矩阵相加和相乘的程序(行数和列数可以在主函数中更改),不得不说一句,有关矩阵的东西就是麻烦:

#include <stdio.h>

#include <stdlib.h>

int** NewMatrix(int row,int col) //动态开辟一个数组

{

int i,j

int** matrix

matrix=(int **)malloc(sizeof(int *)*row)

for(i=0i<rowi++)

{

matrix[i]=(int*)malloc(sizeof(int)*col)

}

//输入矩阵的元素

printf("please input the array elements:\n")

for(i=0i<rowi++)

{

for(j=0j<colj++)

{

scanf("%d",&matrix[i][j])

}

}

return matrix

}

//两矩阵相加a[row][col]+b[row][col]

int **addMatrix(int** a,int** b,int row,int col)

{

int i,j

int** matrix

//动态建立一个矩阵空间以存放运算结果

matrix=(int **)malloc(sizeof(int *)*row)

for(i=0i<rowi++)

{

matrix[i]=(int*)malloc(sizeof(int)*col)

}

//计算a+b

for(i=0i<rowi++)

{

for(j=0j<colj++)

{

matrix[i][j] = a[i][j] + b[i][j]

}

}

return matrix

}

//两矩阵相乘a[row][com]*b[com][col]

int **multiplyMatrix(int **a,int **b,int row,int com,int col)

{

int i,j,k

int** matrix

//动态建立一个矩阵空间以存放运算结果

matrix=(int **)malloc(sizeof(int *)*row)

for(i=0i<rowi++)

{

matrix[i]=(int*)malloc(sizeof(int)*col)

}

//计算a+b

for(i=0i<rowi++)

{

for(j=0j<colj++)

{

matrix[i][j] = 0

for(k=0k<comk++)

{

matrix[i][j] += a[i][k] * b[k][j]

}

}

}

return matrix

}

void main()

{

int i,j

int row = 2,col = 2//行数和列数在此更改

int **a,**b,**c

a = NewMatrix(row,col)//动态建立矩阵a

b = NewMatrix(row,col)//动态建立矩阵b

//调巧亮用函数,求两矩阵的和

c = addMatrix(a,b,row,col)

//输出两矩阵的和

printf("\na add b is:\n")

for(i=0i<rowi++)

{

printf("\n")

for(j=0j<colj++)

{

printf("%d ",c[i][j])

}

}

//调用函数,求两矩阵的积

c = multiplyMatrix(a,b,row,row,col)

//输出两矩阵的积

printf("\na multiply b is:\n")

for(i=0i<rowi++)

{

printf("\n")

for(j=0j<colj++)

{

printf("%d ",c[i][j])

}

}

}

本来程序还可以写得简单一些,由于你要求两矩阵同时能够相加和相乘,从而可以判定两矩阵的行数和列数应该是相等的,因而在函数传递参数的时候只要传一个就行了。但是考虑到程序的可移植性,我在写相加和相乘的子函数时,考虑了普遍性,即对于给定的任意的row和col(甚至row != col),加法和乘法都能够适用。然而这样一来,形参看起来就比较多了。你自己就情况而定吧,不孝橡宽懂的地方发我消息。

调用函数时,尽量用“引用传慎或手递”作为参数, 而不是直接把矩阵本身作为参数传进去,这样在内存中只有一个 P 和 Q的拷贝。

另外,看得出,这两个矩阵光存团圆一份就已经很大了。如果连把它们读入到内存里都宽嫌没办法的话,就最好考虑给自己的机器加内存条了。

不增加内存,那么降低存储空间的需求,就得增加时间复杂度。你可以把矩阵存储在多个硬盘文件里,这样每次读一部分到内存然后处理一些,存回去。最后再一点点拼出来最后结果。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12352036.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存