编程中c 矩阵相乘乘的问题

linuxme 的BLOG
用户名:linuxme
文章数:59
评论数:95
访问量:578180
注册日期:
阅读量:5863
阅读量:12276
阅读量:342046
阅读量:1043482
51CTO推荐博文
1.转圈显示的Java程序,将N x N的方阵转圈赋值并显示输出。如图:N=8,8x8方阵转圈填数结果。
解析:这是一个依靠矩阵中每个元素的下标对其进行操作的典型事例。其要求将1~NXN之间的整数按照从外向里的顺时针方向将其放入其中,并显示输出。
RotatitonClass.java
下面是这个程序的代码:
package javaapplication1;
public class RotatitonClass {
&&& public static final int N=8;&& //方阵的大小
&&& public static void main(String[] args) {
&&&&&&& int[][] m = new int[N][N];& //创建N x N的方阵
&&&&&&& rotating(m,N);&&&&&&&&&&&&& //向方阵中填写数值
&&&&&&& printSquareMatrix(m,N);&&&& //显示方阵
&&& public static void rotating(int[][] m,int num)& //向方向中填写数值
&&&&&&& int k = 1;&&&&&&&&&&&&&&&&& //将要填写的数值
&&&&&&& for (int i = 0; i&=num/2;i++)& //将要填写的圈数
&&&&&&&&&&& for (int j=i;j&num-i;j++)& //上方行方向
&&&&&&&&&&& {
&&&&&&&&&&&&&&& m[i][j]=k++;
&&&&&&&&&&& }
&&&&&&&&&&& for (int j=i+1;j&num-i;j++)& //右侧列方向
&&&&&&&&&&& {
&&&&&&&&&&&&&&& m[j][num-i-1]=k++;
&&&&&&&&&&& }
&&&&&&&&&&& for (int j=num-i-2;j&=i;j--)& //下方行方向
&&&&&&&&&&& {
&&&&&&&&&&&&&&& m[num-i-1][j]=k++;
&&&&&&&&&&& }
&&&&&&&&&&& for (int j=num-i-2;j&i;j--)& //左侧方向
&&&&&&&&&&& {
&&&&&&&&&&&&&&& m[j][i]=k++;
&&&&&&&&&&& }
&&& public static void printSquareMatrix(int[][] m,int num) //显示方阵
&&&&&&& System.out.println();
&&&&&&& for (int i=0;i&i++)
&&&&&&&&&&& for (int j=0;j&j++)
&&&&&&&&&&& {
&&&&&&&&&&&&&&& System.out.printf(&%4d&, m[i][j]);
&&&&&&&&&&& }
&&&&&&&&&&& System.out.println();
在上述小Java程序中,除main主函数外,还定义了2个成员函数,成员函数rotating用于实现按照要求为方阵转圈填数的操作;成员函数printSquareMatrix用于显示方阵。
&& 成员函数rotating是这个程序的核心,它采用每次循环一次填写一圈的算法将NxN个整数填入方阵中。具体做法是从外向内依次填写每圈的内容,每圈按照上、右、下、左的顺时针顺序填写。每圈需要填写的元素数量由方阵大小(num)和圈数(i)决定。
2.& 利用二维数组表示矩阵,并实现两个矩阵相乘的操作。
解析:矩阵可以用来表示统计数据等方面的各种有关联的数据。在数学上,矩阵可以是由方程组的系数及常数构成的方阵。在矩阵的运算中,要求两个相乘的矩阵必须满足第1个矩阵的列数等于第2个矩阵的行数。即对于 Am1&n1和Bm2&n2,要求n1=m2,且结果矩阵C的行列数为m1&n2,其中的每个元素内容为
文件名:Matrix.java
一下是程序的代码:
package javaapplication3;
public class Matrix {
&&& public static final int M1 = 8; //第1个矩阵的行数
&&& public static final int N1 = 5; //第1个矩阵的列数
&&& public static final int M2 = 5; //第2个矩阵的行数
&&& public static final int N2 = 6; //第2个矩阵的列数
&&& public static void main(String[] args) {
&&&&&&& int [][] a =new int[M1][N1]; //创建第1个矩阵
&&&&&&& int [][] b =new int[M2][N2]; //创建第2个矩阵
&&&&&&& enterMatrix(a,M1,N1);&& //输入第1个矩阵
&&&&&&& enterMatrix(b,M2,N2);&& //输入第2个矩阵
&&&&&&& printMatrix(a,M1,N1);&& //显示第1个矩阵
&&&&&&& printMatrix(b,M2,N2);&& //显示第2个矩阵
&&&&&&& if (N1==M2)
&&&&&&&&&&& int[][] c = new int[M1][N2];
&&&&&&&&&&& MulMatrix(a,M1,N1,b,M2,N2,c);
&&&&&&&&&&& printMatrix(c,M1,N2);
public static void enterMatrix(int[][] m, int row, int col) {& //输入矩阵
&&&&& for (int i = 0; i & i++) {
&&&&&&&&&&& for (int j = 0; j & j++) {
&&&&&&&&&&&&&&& m[i][j] = (int) Math.round(Math.random() * 10);
&&&&&&&&&&& }
public static void printMatrix(int[][] m, int row, int col) {& //显示矩阵
&&&&&&&&& System.out.println();
&&&&&&& for (int i = 0; i & i++) {
&&&&&&&&&&& for (int j = 0; j & j++) {
&&&&&&&&&&&&&&& System.out.printf(&%4d&,m[i][j]);
&&&&&&&&&&& }
&&&&&&&&&&& System.out.println();
&&&&&&& System.out.println();
//两矩阵相乘
public static void MulMatrix(int[][] a, int row1, int col1, int[][] b, int row2, int col2, int[][] c) {
for (int i = 0; i & row1; i++) {
&&&&&&&&&&& for (int j = 0; j & col2; j++) {
&&&&&&&&&&&&&&& c[i][j] = 0;
&&&&&&&&&&&&&&& for (int k = 0; k & col1; k++) {
&&&&&&&&&&&&&&&&&&& c[i][j] += a[i][k] * b[k][j];
&&&&&&&&&&&&&&& } } }
运行效果:
两矩阵之乘积
&& &上述程序中,除main函数外,还定义了3个成员函数,成员函数enterMatrix用于实现为矩阵赋值的操作;成员函数printMatrix用于显示矩阵;成员函数MulMatrix用于实现两个矩阵相乘的操作。
& &在成员函数enterMatrix中,为了避免调试程序时需要输入大量数据所带来的麻烦,利用Math类中提供的random这个随机函数产生0~1之间的数值,并经过乘以10再四舍五入的处理,映射为0~10之间的整数,以此模拟键盘的输入,这是在调试程序时经常用到的手段。(在里我们也可根据需要自己输入)
&& 在成员函数printMatrix中,给出的是显示矩阵的常规格式,即外层控制行的输出,内层循环控制烈的输出,每行的内容输出完毕后执行一条换行语句,以此达到矩阵内容按照行列格式输出。
&& 在成员函数MulMatrix中,利用三重循环实现了两个矩阵相乘的操作,这也是一种常规的书写格式。本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)请用c++编写矩阵乘法。
请用c++编写矩阵乘法。
09-02-09 &
// 代码有点冗长,呵呵!// 矩阵加减乘除运算#include &iostream.h&const int arrayX = 5, arrayY = 5;void main(){    double Array1[arrayX][arrayY];    double Array2[arrayX][arrayY];    double ArrayAddResult[arrayX][arrayY];    // 加法结果最终结果    double ArrayDecResult[arrayX][arrayY];    // 减法结果最终结果    double ArrayMulResult[arrayX][arrayY];    // 乘法结果最终结果    double ArrayDivResult[arrayX][arrayY];    // 除法结果最终结果    // 自动赋值给两个矩阵    double counter=1;    for(int i=0; i&arrayX; i++){        for(int j=0; j&arrayY; j++){            Array1[i][j]=Array2[i][j]=            counter++;            ArrayAddResult[i][j]=Array1[i][j]+Array2[i][j];    // +            ArrayDecResult[i][j]=Array1[i][j]-Array2[i][j];    // -            ArrayMulResult[i][j]=Array1[i][j]*Array2[i][j];    // *            ArrayDivResult[i][j]=Array1[i][j]/Array2[i][j];    // /        }    }    cout && &数组已成功赋值!& &&    // 打印 Array1    cout && endl && &Array1:& &&    for(i=0; i&arrayX; i++){        for(int j=0; j&arrayY; j++){            cout && Array1[i][j] && &\t&;        }        cout &&    }    // 打印 Array2    cout && endl && &Array2:& &&    for(i=0; i&arrayX; i++){        for(int j=0; j&arrayY; j++){            cout && Array2[i][j] && &\t&;        }        cout &&    }        // 打印ArrayAddResult    cout && endl && &ArrayAddResult:& &&    for(i=0; i&arrayX; i++){        for(int j=0; j&arrayY; j++){            cout && ArrayAddResult[i][j] && &\t&;        }        cout &&    }        // 打印ArrayDecResult    cout && endl && &ArrayDecResult:& &&    for(i=0; i&arrayX; i++){        for(int j=0; j&arrayY; j++){            cout && ArrayDecResult[i][j] && &\t&;        }        cout &&    }    // 打印ArrayMulResult    cout && endl && &ArrayMulResult:& &&    for(i=0; i&arrayX; i++){        for(int j=0; j&arrayY; j++){            cout && ArrayMulResult[i][j] && &\t&;        }        cout &&    }    // 打印ArrayDivResult    cout && endl && &ArrayDivResult:& &&    for(i=0; i&arrayX; i++){        for(int j=0; j&arrayY; j++){            cout && ArrayDivResult[i][j] && &\t&;        }        cout &&    }}
请登录后再发表评论!
矩阵就是由方程组的系数及常数所构成的方阵。把用在解线性方程组上既方便,又直观。例如对于方程组。 a1x+b1y+c1z=d1 a2x+b2y+c2z=d2 a3x+b3y+c3z=d3 来说,我们可以构成两个矩阵: a1b1c1a1b1c1d1 a2b2c2a2b2c2d2 a3b3c3a3b3c3d3 因为这些数字是有规则地排列在一起,形状像矩形,所以数学家们称之为矩阵,通过矩阵的变化,就可以得出方程组的解来。 矩阵这一具体概念是由19世纪英国数学家凯利首先提出并形成矩阵代数这一系统理论的。 但是追根溯源,矩阵最早出现在我国的<九章算术>中,在<九章算术>方程一章中,就提出了解线性方程各项的系数、常数按顺序排列成一个长方形的形状。随后移动处筹,就可以求出这个方程的解。在欧洲,运用这种方法来解线性方程组,比我国要晚2000多年。 数学上,一个m×n矩阵乃一m行n列的矩形阵列。矩阵由数组成,或更一般的,由某环中元素组成。 矩阵常见于线性代数、线性规划、统计分析,以及组合数学等。请参考矩阵理论。 目录 [隐藏] 1 历史 2 定义和相关符号 2.1 一般环上构作的矩阵 2.2 分块矩阵 3 特殊矩阵类别 4 矩阵运算 5 线性变换,秩,转置 6 Jacobian 行列式 7 参见 [编辑] 历史 矩阵的研究历史悠久,拉丁方阵和幻方在史前年代已有人研究。 作为解决线性方程的工具,矩阵也有不短的历史。1693年,微积分的发现者之一戈特弗里德o威廉o莱布尼茨建立了行列式论(theory of determinants)。1750年,加布里尔o克拉默其后又定下了克拉默法则。1800年代,高斯和威廉o若尔当建立了高斯—若尔当消去法。 1848年詹姆斯o约瑟夫o西尔维斯特首先创出matrix一词。研究过矩阵论的著名数学家有凯莱、威廉o卢云o哈密顿、格拉斯曼、弗罗贝尼乌斯和冯o诺伊曼。 [编辑] 定义和相关符号 以下是一个 4 × 3 矩阵: 某矩阵 A 的第 i 行第 j 列,或 i,j位,通常记为 A[i,j] 或 Ai,j。在上述例子中 A[2,3]=7。 在C语言中,亦以 A[j] 表达。(值得注意的是,与一般矩阵的算法不同,在C中,&行&和&列&都是从0开始算起的) 此外 A = (aij),意为 A[i,j] = aij 对于所有 i 及 j,常见于数学著作中。 [编辑] 一般环上构作的矩阵 给出一环 R,M(m,n, R) 是所有由 R 中元素排成的 m× n 矩阵的集合。若 m=n,则通常记以 M(n,R)。这些矩阵可加可乘 (请看下面),故 M(n,R) 本身是一个环,而此环与左 R 模 Rn 的自同态环同构。 若 R 可置换, 则 M(n, R) 为一带单位元的 R-代数。其上可以莱布尼茨公式定义 行列式:一个矩阵可逆当且仅当其行列式在 R 内可逆。 在维基百科内,除特别指出,一个矩阵多是实数矩阵或虚数矩阵。 [编辑] 分块矩阵 分块矩阵 是指一个大矩阵分割成“矩阵的矩阵”。举例,以下的矩阵 可分割成 4 个 2×2 的矩阵 。 此法可用于简化运算,简化数学证明,以及一些电脑应用如VLSI芯片设计等。 [编辑] 特殊矩阵类别 对称矩阵是相对其主对角线(由左上至右下)对称, 即是 ai,j=aj,i。 埃尔米特矩阵(或自共轭矩阵)是相对其主对角线以复共轭方式对称, 即是 ai,j=a*j,i。 特普利茨矩阵在任意对角线上所有元素相对, 是 ai,j=ai+1,j+1。 随机矩阵所有列都是概率向量, 用于马尔可夫链。 [编辑] 矩阵运算 给出 m×n 矩阵 A 和 B,可定义它们的和 A + B 为一 m×n 矩阵,等 i,j 项为 (A + B)[i, j] = A[i, j] + B[i, j]。举例: 另类加法可见于矩阵加法. 若给出一矩阵 A 及一数字 c,可定义标量积 cA,其中 (cA)[i, j] = cA[i, j]。 例如 这两种运算令 M(m, n, R) 成为一实数线性空间,维数是mn. 若一矩阵的列数与另一矩阵的行数相等,则可定义这两个矩阵的乘积。如 A 是 m×n 矩阵和 B 是 n×p矩阵,它们是乘积 AB 是一个 m×p 矩阵,其中 (AB)[i, j] = A[i, 1] * B[1, j] + A[i, 2] * B[2, j] + ... + A[i, n] * B[n, j] 对所有 i 及 j。 例如 此乘法有如下性质: (AB)C = A(BC) 对所有 k×m 矩阵 A, m×n 矩阵 B 及 n×p 矩阵 C (&结合律&). (A + B)C = AC + BC 对所有 m×n 矩阵 A 及 B 和 n×k 矩阵 C (&分配律&)。 C(A + B) = CA + CB 对所有 m×n 矩阵 A 及 B 和 k×m 矩阵 C (&分配律&)。 要注意的是:可置换性不一定成立,即有矩阵 A 及 B 使得 AB ≠ BA。 对其他特殊乘法,见矩阵乘法。 [编辑] 线性变换,秩,转置 矩阵是线性变换的便利表达法,皆因矩阵乘法与及线性变换的合成有以下的连系: 以 Rn 表示 n×1 矩阵(即长度为n的矢量)。对每个线性变换 f : Rn -& Rm 都存在唯一 m×n 矩阵 A 使得 f(x) = Ax 对所有 x & Rn。 这矩阵 A &代表了& 线性变换 f。 今另有 k×m 矩阵 B 代表线性变换 g : Rm -& Rk,则矩阵积 BA 代表了线性变换 g o f。 矩阵 A 代表的线性代数的映像的维数称为 A 的矩阵秩。矩阵秩亦是 A 的行(或列)生成空间的维数。 m×n矩阵 A 的转置是由行列交换角式生成的 n×m 矩阵 Atr (亦纪作 AT 或 tA),即 Atr[i, j] = A[j, i] 对所有 i and j。若 A 代表某一线性变换则 Atr 表示其对偶算子。转置有以下特性: (A + B)tr = Atr + Btr,(AB)tr = BtrAtr。
 回答
请登录后再发表评论!C语言程序设计-矩阵乘法[数组应用]
C语言程序设计-矩阵乘法[数组应用]
, 围观1944次
【问题描述】已知矩阵A(m*n)和B(n*p),求C=A*B。
【输入形式】第一行三个整数为m,n,p(m,n,p均小于10),从第二行开始为m行n列A矩阵,然后为n行p列的B矩阵。
&&&&&&&&&&&&&&&&&&&&&&所有数据之间均由一个空格分隔。
【输出形式】输出m行p列的C矩阵,所有数据之间均由一个空格分隔,输出的每一个数据后面跟一个空格。
【样例输入】2 3 4
& & & & & & & & & & 1 0 3
& & & & & & & & & & &3 4 0
& & & & & & & & & & &1 0 2 1
& & & & & & & & & &&&2 3 4 5
&&&&&&&&&&&&&&&&&&&&&2 1 1 5
【样例输出】7 3 5 16
&&&&&&&&&&&&&&&&&&&&11 12 22 23
【样例说明】最后得到的2行4列的矩阵如上图所示。
【评分标准】本题共2个测试点,每个测试点0.5分,全部通过得1.0分。
#include &stdio.h&
int m1[12][12], m2[12][12], m3[12][12];
int m,pattern_len,p;
int main() {
scanf(&%d%d%d&, &m, &pattern_len, &p);
for(int i=0; i&m; i++)
for(int j=0; j&pattern_ j++)
scanf(&%d&, &m1[i][j]);
for(int i=0; i&pattern_ i++)
for(int j=0; j&p; j++)
scanf(&%d&, &m2[i][j]);
for(int i=0; i&m; i++){
for(int j=0; j&p; j++){
m3[i][j] = 0;
for(int k=0; k&pattern_ k++){
m3[i][j] += m1[i][k] * m2[k][j];
printf(&%d &, m3[i][j]);
您可能还会对这些文章感兴趣!c语言&实矩阵乘法&&复矩阵乘法&程序举例
矩阵求导,请参看,下面更多文章:
1. 实矩阵乘法:
//=======================
//======================================================
//函数名:r_matmul
//功能描述:两个实矩阵相乘
//输入参数:a(左矩阵) b(右矩阵) &c(结果矩阵)
& & & m(左矩阵行数)
p(左矩阵列数) n(右矩阵列数)
//返回值:运行成功则返回1,失败则返回0
//=========================================================
#include "stdio.h"
#include "stdlib.h"
int r_matmul(a, b, m, p, n, c)
double *a, *b, *c;
int m,p,n;
& & int i,j,k;
& & if(!(m&0
检查输入矩阵的阶数
& printf("Dimension of a matrix is
incorrect\n");
& return(0);
& & if(a == NULL || b ==
NULL || c == NULL) & // 检查输入指针是否为空
& printf("The matrix pointer is NULL\n");
& return(0);
& & for(i=0;
i&m; i++) & &
&// 循环遍历矩阵c中的每个元素
& for(j=0; j&n; j++)
& & & tmp = 0.0;
初值先存在临时变量中
& & & for(k=0;
k&p; k++) & &
&// 循环累加
& & tmp +=
a[i*p+k]*b[k*n+j];
& & & c[i*n+j] =
将得到的结果放入矩阵c中
& & return(1);
//================================
2. 复矩阵乘法
//================================
#include "stdio.h"
#include "stdlib.h"
#include "c_comp.c" //需要调用复数运算的算法
//======================================================
//函数名:cmat_mul
//功能描述:两个复矩阵相乘
//输入参数:a(左矩阵) b(右矩阵) &c(结果矩阵)
& & & m(左矩阵行数)
p(左矩阵列数) n(右矩阵列数)
//返回值:运行成功则返回1,失败则返回0
//=========================================================
int c_matmul(a, b, m, p, n, c)
struct c_comp *a, *b, *c;
int m,p,n;
& & int i,j,k;
& & struct c_comp tmp1,
& & if(!(m&0
&& n&0)) //
检测输入矩阵的阶数
& printf("Err:(c_mat_mul)Dimension of a matrix is
incorrect\n");
& return(0);
& & if(a == NULL || b ==
NULL || c == NULL)
& printf("Err:(c_mat_mul)The matrix pointer is
& return(0);
& & for(i=0;
i&m; i++) // 循环编历矩阵c中的每个元素
& for(j=0; j&n; j++)
& & & tmp1.rmz =
0.0; // 初值先存入复临时变量中
& & & tmp1.imz =
& & & for(k=0;
k&p; k++) //循环累加
c_comp_product(&a[i*m+k],
&b[k*m+j], &tmp2);
c_comp_plus(&tmp1,&tmp2,&tmp1);
c[i*n+j].rmz = tmp1. // 将计算的结果存入矩阵c中
c[i*n+j].imz = tmp1.
& & return(1);
//==========================
//===========================
//======================================================
//函数名:r_matmul
//功能描述:两个实矩阵相乘
//输入参数:a(左矩阵) b(右矩阵) &c(结果矩阵)
& & & m(左矩阵行数)
p(左矩阵列数) n(右矩阵列数)
//返回值:运行成功则返回1,失败则返回0
//=========================================================
#include "stdio.h"
#include "stdlib.h"
int r_matmul(a, b, m, p, n, c)
double *a, *b, *c;
int m,p,n;
& & int i,j,k;
& & if(!(m&0
& printf("Dimension of a matrix is
incorrect\n");
& return(0);
& & if(a == NULL || b ==
NULL || c == NULL) & // 检查输入指针是否为空
& printf("The matrix pointer is NULL\n");
& return(0);
& & for(i=0;
i&m; i++) & &
&// 循环遍历矩阵c中的每个元素
& for(j=0; j&n; j++)
& & & tmp = 0.0;
初值先存在临时变量中
& & & for(k=0;
k&p; k++) & &
&// 循环累加
& & tmp +=
a[i*p+k]*b[k*n+j];
& & & c[i*n+j] =
将得到的结果放入矩阵c中
& & return(1);
//===========================
另外,请把函数改成C99标准,以增加兼容性。
==========================
我的更多文章:
( 16:19:00)( 19:59:54)( 21:58:09)( 20:18:39)( 08:33:37)
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。C语言求大神,两个矩阵相乘( 矩阵不是编程的时候就定义好的,是用scanf输入的 )_百度知道}

我要回帖

更多关于 c 矩阵相乘 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信