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的拷贝。另外,看得出,这两个矩阵光存团圆一份就已经很大了。如果连把它们读入到内存里都宽嫌没办法的话,就最好考虑给自己的机器加内存条了。
不增加内存,那么降低存储空间的需求,就得增加时间复杂度。你可以把矩阵存储在多个硬盘文件里,这样每次读一部分到内存然后处理一些,存回去。最后再一点点拼出来最后结果。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)