用数组循环实现矩阵乘法php,C++一维数组实现矩阵的转置与乘法

本文介绍了如何使用C++进行动态内存分配来构建一维和二维可变长数组,进而实现矩阵的创建、可视化、转置和乘法操作。通过模板函数实现通用性,详细探讨了矩阵转置和乘法的算法,并讨论了在处理过程中的一维数组存储策略。
摘要由CSDN通过智能技术生成

矩阵的构建策略

为保证多数据的兼容性,以及普遍性。本篇笔者使用C++模板进行书写。同时变量定义使用了“()”进行初始化操做。算法

首先是构造可变长数组的策略:使用堆内存,笔者未使用vector。固然vector应当更方便操做数组

int n, m;

cin >> n >> m;

int *a = new int[n*m];

//使用此方法进行一维可变长数组的构造

int n, m;

cin >> n >> m;

int **a = new int*[N];

//使用此方法进行二维可变长数组的构造

for (int i = 0; i < N; ++i)

a[i] = new int[M];

for (int i = 0; i < N; ++i)

for (int j = 0; j < M; ++j)

a[i][j] = 0;

//此处补充二维变长数组的数据输入操做

笔者初始策略采用了二维变长数组进行了矩阵的相关操做,十分的简单粗暴。能够说是很是的舒爽了。可是,有点大材小用。毕竟以此双指针的实现策略能够用于用于解决不一样行要求数据数量不一样的问题。而矩阵这种行、列都已经明确知道的问题彻底可使用一维数组进行解决。函数

矩阵的遍历

因为使用一维数组进行矩阵操做,第一步必然为矩阵的可视化操做。实现思路很简单定义一个flag,计数输出元素,在适当的地方进行换行操做。最后不要忘记在换行以后对此变量进行重置。指针

/**************************************

函数名:Print

参数类型:指针,int,int

参数说明:指针类型:指针为指向一维数组的指针

int:传参画出了传入的数组大小(size_r * size_c)

函数功能:以正确的方式输出矩阵

特别说明:进行输出时,转置前和转置后的的矩阵须要将size_r 和 size_c 的位置对调

***************************************/

template

void Print(const T* matrix, int size_r, int size_c)

{

cout << endl << "矩阵输出为:" << endl << endl;

int flag(0);

for (int i = 0; i < size_r * size_c; i++) {

cout << matrix[i] << " ";

++flag;

if (flag == size_c) {//当 flag == size_c 时,进行换行操做

cout << endl;

flag = 0;

}

}

cout << endl << "矩阵输出完成" << endl << endl;

}

矩阵转置

在二维数组先实现异常简单,只须要一个swap函数将数组对应位置的元素进行交换便可。当使用一维数组进行此行为时却没有那么理想。本来想使用单数组进行原地转置,实际操做中发现算法有点复杂(实际上是笔者太菜)故笔者的解决办法是使用返回值类型为指针的函数进行操做。在函数内再次开辟新的堆内存。将原矩阵进行转置操做。将新的数组做为返回值返还。因为 C++中指向堆的指针在释放其所指内存的内容(delete操做)以后。该指针依旧存在,只是其所指内存块不在具备意义。所以也能够给该指针赋予新的值。code

/**************************************

函数名:Transpose

参数类型:指针,int,int

参数说明:指针类型:指针为指向一维数组的指针

int:传参画出了传入的数组大小(size_r * size_c)

函数功能:以正确的方法进行矩阵转置

特别说明:无

***************************************/

template

void Print(const T* matrix, int size_r, int size_c)

{

T* new_matrix = new T[size_r * size_c]{ 0 };

int row(0), col(0);

for (; row < size_r; row++) {

for (; col < size_c; col++)

new_matrix[col * size_r + row] = matrix[row * size_c + col];//转置

col = 0;//重置循环变量

}

delete matrix;

return new_matrix;

}

矩阵的乘法

一维数组是按行优先进行矩阵存储的

所以,矩阵同行不一样列的元素,在一维数组中相差的是“列”

同列不一样行的元素,在一维数组中相差的是“行”

row 表示新矩阵将几行

col 表示新矩阵将有几列

mk 表示内部相乘相加循环ip

new_matrix[row * size_c2 + col]

row * size_c2表示当前存储到当前新矩阵的第几行 + col 表示第几列

这种写法保证了一维数组的排列模式,而且遵循了矩阵的行列内存

matrix1[row * size_c1 + mk]

row * size_c1 表示 matrix1 的行元素,用以肯定如今进行乘法运算的元素位于第几行

+ mk 用以更新进行乘法运算的元素所处的“列”号

二者相加即是目标元素在一维数组中的目标位置ci

matrix2[mk * size_c2 + col]

col 表示 matrix2 须要进行乘法运算的首个列元素

mk * size_c2 挨个遍历同列元素模板

最后莫要忘记初始化自定义的数组。class

/**************************************

函数名:Multiply

参数类型:T* T* int int int int

参数说明:传欸两个须要相乘的矩阵,

函数功能:矩阵相乘

特别说明:size_c1 和 size_r2 这两形参能够合并

***************************************/

template

T* Multiply(T* matrix1, T* matrix2, int size_r1, int size_c1, int size_r2, int size_c2)

{

if (size_c1 != size_r2)

throw"error";

T* new_matrix = new T[size_r1 * size_c2]{ 0 };

int row(0), col(0), mk(0);

for (; row < size_r1; row++) {

for (; col < size_c2; col++) {

int temp(0);

for (; mk < size_c1; mk++)

new_matrix[row * size_c2 + col] += matrix1[row * size_c1 + mk] * matrix2[mk * size_c2 + col];

mk = 0;

}

col = 0;

}

delete matrix1;

delete matrix2;

matrix1 = nullptr;

matrix2 = nullptr;

return new_matrix;

}

笔者在函数中进行了delete操做,因此在调用时,若再次进行delete变回触发异常。

而后不是很肯定颜色是否能正常显示....有点慌.....

嗯,先分享这么多!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值