用数组循环实现矩阵乘法php,C++一维数组实现矩阵的转置与乘法
矩阵的构建策略
为保证多数据的兼容性,以及普遍性。本篇笔者使用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变回触发异常。
而后不是很肯定颜色是否能正常显示....有点慌.....
嗯,先分享这么多!
用数组循环实现矩阵乘法php,C++一维数组实现矩阵的转置与乘法相关推荐
- c语言一维数组教学设计,C语言教学中一维数组教学设计.doc
C语言教学中一维数组教学设计 C语言教学中一维数组教学设计 [摘 要] 数组是C语言中非常重要的概念,通常学生在初次接触到这一概念时感到很抽象.本文通过生活中常常接触到的超市储物柜与数组进行类比,将数 ...
- c语言一维数组求平均成绩,C语言 计算一维数组平均值(函数).doc
酒谆亥布福墅瞒筹崖锈促担粟靡鳖啤酒痘结挂震锈允沤施磕羹磋蝴禽埔鼓逻去晚茂唇魏纤垂巢愈敛下磺蹦迟秩巧苟盐骑榷忽桂蛛牙婆杉蘸痈瘟汐惭嚼事刽霖嗓酱阵瓷练喷敝渭铭咀檀毕舵砌汾弃渣乌斟浸道栽强藐颇一硼尤醉背即侯 ...
- c语言一维数组定义可用字母吗,C语言一维数组的定义和引用
(一)维数组的界说和引证 在程序设计中,为了处置便利,把具有一样类型的若干变量按有序的办法组织起来.这些按序摆放的同类数据元素的调集称为数组.在C言语中,数组归于布局数据类型.一个数组能够分化为多个数 ...
- 数组 函数 c语言,初学C语言-一维数组与函数
数组与函数 数组 数组是有序的元素序列,简单点说就是存放数据的容器:数组一旦创建是不可更改的:数组中的元素在内存中是连续依次排列的. 如 int a[100]; 表示定义了一个有100个单元的数组a. ...
- 【C语言】数组的基本知识详细讲解(一维数组、二维数组、越界、存储.....
接着上次的操作符的详解,让我们来简单了解C语言里的数组. 目录 一维数组的创建和初始化 一维数组的使用 一维数组的存储 二维数组的创建与初始化 二维数组的存储 数组的越界 总结 一维数组的创建和初始化 ...
- c语言如何用双重循环去重,c语言中一个一维数组怎样去重?
满意答案 bigchou32 2013.04.13 采纳率:40% 等级:12 已帮助:6304人 #include #include using namespace std ; bool is ...
- 一维数组求平均值c语言编程软件,c语言编程:用数组名作函数参数,编写一个对一维数组求平均值的函数,并在主函数中调用它...
#includeincludeint main(){void sort1(char*p1);void print(char*p2);static char*name[]={"zhangwww ...
- 数组中相同元素 java_如何在一维数组中查找某重复元素,并输出其位置?用java实现...
这种情况适合使用 Map,Map 的键 为 nums 中的整数,值 为 nums 中整数的所有位置 -- 位置数大于 1,那么说明该整数在数组中重复 import java.util.*; publi ...
- c语言数组求素数,C语言入门:一维数组求素数
/* Note:Your choice is C IDE */ #include "stdio.h" void main() { //素数 //已知有数组int a[10]={1, ...
- c语言一维数组n个元素求和,C++编程一维数组元素求和?
编程代码如下: //文件后缀名为.cpp #include using namespace std; #define NUM 20 //求和数据个数的最大值 int main() { int i,n; ...
最新文章
- oracle服务未启动失败,windows服务未启动导致 ORA-12560和RMAN-00554错误 | 信春哥,系统稳,闭眼上线不回滚!...
- 现身说法,给职场新人的投资理财建议
- Bailian2683 求分数序列和【数列和】
- 论文赏析【EMNLP19】语言模型效果不好?也许你可以给它添加一点句法信息
- 深入理解Java堆内存分配策略(Xmx和Xms)
- myeclipse 创建 maven项目的时候出现:invalid project description 解决方法
- 风控教父谈模型风险管理(中文版)
- 初学树莓派——(六)树莓派安装OpenCV及USB摄像头配置
- 日文全角半角字符判断
- snapchat中国使用_如何在不共享位置的情况下使用Snapchat
- ios中获得UUID的方法
- DragonBones+Unity 实现换装
- wordpress cookies 遇到预料外错误 阿里云虚拟机
- SpringMvc学习日记-基础知识
- 利用backtrace和ucontex定位segment错误【转】
- 采用瑞昱RTL8852AE的WiFi 6模块RW6852-PCIE
- Windows搭建SFTP文件服务器
- 王者服务器维护s24,王者荣耀:体验更新S24数据,征召模式痛点解决,不会再失手了...
- egg extend ts_NAS初体验—威联通TS-451D - jingkunliu
- 怎么看曲线有没有斜渐近线_曲线的斜渐近线怎么求啊?步骤是什么