JAVA矩阵的加减和转置

在数学上,矩阵是由方程组的系数及常数所构成的方阵。用在解线性方程组上既方便又直观。生活中通过矩阵多因素探索解决问题。

程序如下:

package JAVA_Project_01_04;//创建一个包
//在数学上,矩阵是由方程组的系数及常数所构成的方阵。用在解线性方程组上既方便又直观。生活中通过矩阵多因素探索解决问题。
//对数组进行初始化有两种方法:在声明变量时直接初始化;运用循环对其进行初始化。
//Java支持多维数组,可以用二维数组表示矩阵。
//对矩阵进行操作前,需要进行合法性验证,判断它们是否能进行运算。
import java.text.DecimalFormat;//引入类

public class TextMatrix {//操作矩阵的类,使用二维数组

    private double[][] data;//矩阵数据

    public TextMatrix() {//默认构造函数
    }

    public TextMatrix(double[][] data) {//初始化矩阵
        if (CanTransTomatrix(data))//判断数组是否能转换成矩阵
            this.data = this.cloneArray(data);
    }

    private static boolean CanTransTomatrix(double[][] data) {//判断二维数组能够转换成矩阵
        if (data == null)//判断二维数组是否为空
            return false;
        for (int i = 0; i <= data.length - 2; i++) {//循环依次比较如果长度不相等则返回false
            if (data[i].length != data[i + 1].length)//数组长度比较
                return false;
        }
        return true;
    }

    public String showArray(double[][] data) {//格式化数组
        DecimalFormat format = new DecimalFormat("0.00");//数据格式化保留两位小数
        StringBuffer buffer = new StringBuffer("");//声明StringBuffer可以修改数据
        for (int i = 0; i < data.length; i++) {//遍历一个二维数组按格式显示
            //将数组元素转化成指定格式
            for (int j = 0; j < data.length; j++) {
                buffer.append(format.format(data[i][j])).append(" ");
            }
            buffer.append("\n");//换行
        }
        return buffer.toString();
    }

    public void showData() {//调用方法显示二维数组
        System.out.println(showArray(this.data));
    }

    private double[][] cloneArray(double[][] data) {//克隆一个二维数组
        if (data == null)
            return null;
        return (double[][]) data.clone();
    }

    public double[][] getMatrixData() {//获得矩阵
        return cloneArray(this.data);
    }

    public TextMatrix add(TextMatrix t) {//矩阵加法运算
        if (t == null)
            return null;
        TextMatrix text = null;
        double[][] tmData = t.getMatrixData();//获得一个矩阵
        if ((this.data.length != tmData.length) || (this.data[0].length != tmData[0].length)) {//判断矩阵行数列数是否相等
            System.out.println("两个矩阵大小不一");
            return text;
        } else {
            double[][] result = new double[this.data.length][this.data[0].length];
            for (int i = 0; i < this.data.length; i++) {//依次循环行数
                for (int j = 0; j < this.data[0].length; j++) {//依次循环列数
                    result[i][j] = this.data[i][j] + tmData[i][j];//两个矩阵相加
                }
            }
            text = new TextMatrix(result);//将新生成的矩阵传入对象中
            return text;//返回对象
        }
    }

    public TextMatrix subtration(TextMatrix t) {//矩阵减法运算
        if (t == null)
            return null;
        TextMatrix text = null;
        double[][] tmData = t.getMatrixData();//获得一个矩阵
        if ((this.data.length != tmData.length) || (this.data[0].length != tmData[0].length)) {//判断矩阵行数列数是否相等
            System.out.println("两个矩阵大小不一");
            return text;
        } else {
            double[][] result = new double[this.data.length][this.data[0].length];
            for (int i = 0; i < this.data.length; i++) {//依次循环行数
                for (int j = 0; j < this.data[0].length; j++) {//依次循环列数
                    result[i][j] = this.data[i][j] - tmData[i][j];//两个矩阵相减
                }
            }
            text = new TextMatrix(result);//将新生成的矩阵传入对象中
            return text;//返回对象
        }
    }

    public TextMatrix transposeMatrix() {//矩阵转置,格式为a[i][j]=b[j][i]
        int Row = this.data[0].length;
        int Column = this.data.length;
        double[][] change = new double[Row][Column];//声明一个二维数组,长度指定
        for (int i = 0; i < Row; i++) {
            for (int j = 0; j < Column; j++) {
                change[i][j] = this.data[j][i];//循环进行转置
            }
        }
        return new TextMatrix(change);
    }

    public static void main(String[] args) {//Java程序主入口处
        double[][] data1 = new double[][]{{1.0, 2.0, 3.0}, {4.0, 5.0, 6.0}, {7.0, 8.0, 9.0}};
        double[][] data2 = new double[3][3];//声明一个二维数组,没有初始化
        for (int i = 0; i < 3; i++) {//for循环依次初始化二维数组
            for (int j = 0; j < 3; j++) {
                data2[i][j] = 2 * i + j;//进行赋值
            }
        }
        TextMatrix matrix1 = new TextMatrix(data1);
        TextMatrix matrix2 = new TextMatrix(data2);
        System.out.println("两组二维数组展示:");
        matrix1.showData();//二维数组展示
        matrix2.showData();
        System.out.println("矩阵加减法运算结果:");
        matrix1.add(matrix2).showData();//显示矩阵加法运算结果
        System.out.println("矩阵减法运算结果:");
        matrix1.subtration(matrix2).showData();//显示矩阵减法运算结果
        System.out.println("矩阵matrix1的转置结果:");
        matrix1.transposeMatrix().showData();//矩阵转置的结果
    }
}
/*
本实例根据不同的方法对二维数组进行初始化,并采用二维数组存放矩阵的数据。并对要操作的两个数组进行行和列是否一致的判断。
add()方法实现了矩阵的加法运算,根据矩阵加法的条件,判断参与加法的两个矩阵是否可加,并将结果数组变换为矩阵对象返回。
sub()方法实现了矩阵减法运算,当前对象是被减数,输入参数对象是减数。
clone()方法用于克隆一个矩阵。
 */

发布了70 篇原创文章 · 获赞 10 · 访问量 3200

猜你喜欢

转载自blog.csdn.net/JN_Cat/article/details/102623167
今日推荐