数据结构与算法(3)——矩阵的加、乘、转置运算实现

来源:互联网 发布:淘宝聚划算团购每一天 编辑:程序博客网 时间:2024/05/01 03:58

定义:由 m × n 个数aij排成的m行n列的数表称为m行n列的矩阵,简称 m × n矩阵;在编程语言中可以当做二维数组来处理;
加减法:同型矩阵之间
乘法:两个矩阵的乘法仅当第一个矩阵A的列数和另一个矩阵B的行数相等时才能定义。如A是m×n矩阵和B是n×p矩阵,它们的乘积C是一个m×p矩阵 ;
转置:把矩阵A的行换成同序数的列所得到的新矩阵称为A的转置矩阵;
详细的运算及原理可以百度一下;
如下是完整的Java代码实现:

package algorithm;public class Matrix {    public final int TYPE_ADD = 1;    public final int TYPE_MUL = 2;    /**     * 矩阵类,实现n阶矩阵的加、乘、转置运算     *      * @param args     */    public static void main(String[] args) {        // TODO Auto-generated method stub        int[][] a = { { 1, 2 }, { 2, 3 } };        int[][] b = { { 4, 5 }, { 6, 7 } };        int[][] aa = new int[][]{{1,0,2},{-1,3,1}};        int[][] bb = new int[][]{{3,1}, {2,1},{1,0}};        Matrix m = new Matrix();        System.out.println("两矩阵相加:");        int[][] r = m.matrix_add(a, b);        for (int i = 0; i < r.length; i++) {            for (int j = 0; j < r[i].length; j++) {                System.out.print(r[i][j] + "\t");            }            System.out.println();        }        System.out.println("两矩阵相乘:");        r = m.matrix_mul(aa, bb);        for (int i = 0; i < r.length; i++) {            for (int j = 0; j < r[i].length; j++) {                System.out.print(r[i][j] + "\t");            }            System.out.println();        }        System.out.println("矩阵转置:");        r = m.matrix_tran(a);        for (int i = 0; i < r.length; i++) {            for (int j = 0; j < r[i].length; j++) {                System.out.print(r[i][j] + "\t");            }            System.out.println();        }    }    // 矩阵相加    public int[][] matrix_add(int[][] a, int[][] b) {        int[][] c = new int[a.length][a[0].length];        if (inputLegal(a, b, TYPE_ADD)) {// 只有同型矩阵才能相加            for (int i = 0; i < a.length; i++) {// i控制行                for (int j = 0; j < a[i].length; j++) {// j控制列                    c[i][j] = a[i][j] + b[i][j];                }            }        }        return c;    }    // 矩阵相乘    public int[][] matrix_mul(int[][] a, int[][] b) {        int[][] d = new int[a.length][b[0].length];        if (inputLegal(a, b, TYPE_MUL)) {// 两个矩阵的乘法仅当第一个矩阵A的行数和另一个矩阵B的列数相等时才能定义            for (int i = 0; i < a.length; i++) {// 最终结果矩阵为A的行                for (int j = 0; j < b[i].length; j++) {// 最终结果矩阵为B的列                    /*                     * 罗列系数之后会发现如下规律,a的行标记随i,b的列标记随j,而a的列标记和b的行标记一样,且从0到n,                     * 其中n为a的列数,故还需要一个变量k来循环控制这个从0到n的标记                     */                    int num = 0;                    for (int k = 0; k < a[i].length; k++) {                        num += a[i][k] * b[k][j];                    }                    d[i][j] = num;                }            }        }        return d;    }    //矩阵转置    public int[][] matrix_tran (int[][] a) {        //矩阵A的行换成同序数的列所得到的新矩阵称为A的转置矩阵        int[][] e = new int[a[0].length][a.length];        for (int i = 0; i < a.length; i++) {            for (int j = 0; j< a[0].length; j++) {                e[j][i] = a[i][j];            }        }        return e;    }    // 矩阵类型校验    public boolean inputLegal(int[][] a, int[][] b, int type) {        boolean flag = true;        if (type == TYPE_ADD) {            if (a.length != b.length || a[0].length != b[0].length) {                flag = false;// 判断是否为同型矩阵            }        }        if (type == TYPE_MUL) {            if (a.length != b[0].length) {                flag = false;// 判断一个矩阵的行与另一个矩阵的列是否相等            }        }        return flag;    }}

期待你的更高效代码!

0 0
原创粉丝点击