java实现矩阵的加减乘除


用java实现矩阵的加减乘除 矩阵用数组表示,输入数组后,通过代码里面的get方法获得矩阵。
package com.xiaoyu.demo;

import java.util.Arrays;

public class Matrix {
  /**
   * 通过矩阵返回行向量,直接返回,只为了代码可读性更强
   * 
   * @param m1
   * @return
   */
  public double[] getRowVector(double[] m) {
    return m;
  }

  /**
   * 通过输入的数组返回,这个数组对应的行向量的转置,即返回列向量
   * 
   * @param m1
   * @return
   */
  public double[][] getColVector(double[] m) {
    double[][] mTo = new double[1][1];
    mTo[0] = m;
    return matrixTranspose(mTo);
  }

  /**
   * 通过一个数组返回一个矩阵,直接返回,为了提高代码可读性
   * 
   * @param m
   * @return
   */
  public double[][] getMatrix(double[][] m) {
    return m;
  }


  /**
   * 返回输入矩阵的转置
   * 
   * @param m
   * @return
   */
  public double[][] matrixTranspose(double[][] m) {
    double[][] res = new double[m[0].length][m.length];
    for (int i = 0; i < m.length; i++) {
      for (int j = 0; j < m[0].length; j++) {
        res[j][i] = m[i][j];
      }
    }
    return res;
  }

  /**
   * 返回矩阵相加的结果, m1[m] + m2[m] = res[m]
   * 
   * @param m1
   * @param m2
   * @return
   */
  public double[] matrixAdd(double[] m1, double[] m2) {
    double[][] m1To = new double[1][1];
    m1To[0] = m1;
    double[][] m2To = new double[1][1];
    m2To[0] = m2;
    return matrixAdd(m1To, m2To)[0];
  }

  /**
   * 返回矩阵相加的结果,m1[m][n] * m2[m]n] = res[m][n]
   * 
   * @param m1
   * @param m2
   * @return
   */
  public double[][] matrixAdd(double[][] m1, double[][] m2) {
    if (m1.length != m2.length || m1[0].length != m2[0].length) {
      System.out.println("矩阵不能相乘,因为不满足 m1[m][n] * m2[m]n] = res[m][n]");
      return null;
    }
    double[][] res = new double[m1.length][m2[0].length];
    for (int i = 0; i < m1.length; i++) {
      for (int j = 0; j < m1[0].length; j++) {
        res[i][j] = m1[i][j] + m2[i][j];
      }
    }
    return res;
  }

  /**
   * 返回两个矩阵相乘的结果,结果也是一个矩阵。m1[m][n] * m2[n][t] = res[m][t]
   * 
   * @param m1
   * @param m2
   * @return
   */
  public double[][] matrixMultiply(double[][] m1, double[][] m2) {
    if (m1[0].length != m2.length) {
      System.out.println("矩阵不能相乘,因为不满足 m1[m][n] * m2[n][t] = res[m][t]");
      return null;
    }
    double[][] res = new double[m1.length][m2[0].length];
    for (int i = 0; i < m1[0].length; i++) {
      for (int j = 0; j < m2.length; j++) {
        double[] row = getMatrixRow(m1, i);
        double[] col = getMatrixCol(m2, j);
        res[i][j] = matrixInnerMultiply(row, col);
      }
    }
    return res;
  }

  /**
   * 返回行向量 * 列向量
   * 
   * @param m1
   * @param m2
   * @return
   */
  public double[][] matrixMultiply(double[] m1, double[][] m2) {
    double[][] m1To = new double[1][1];
    m1To[0] = m1;
    return matrixMultiply(m1To, m2);
  }


  /**
   * 返回单行矩阵,与单列矩阵的乘积,m1[m] * m2[m] = res
   * 
   * @param m1
   * @param m2
   * @return
   */
  public double matrixInnerMultiply(double[] m1, double[] m2) {
    double res = 0;
    for (int i = 0; i < m1.length; i++) {
      res += m1[i] * m2[i];
    }
    return res;
  }

  /**
   * 返回(num * 矩阵)的结果
   * 
   * @param num
   * @param m2
   * @return
   */
  public double[][] matrixMultiply(double num, double[][] m2) {
    double[][] res = new double[m2.length][m2[0].length];
    for (int i = 0; i < m2.length; i++) {
      for (int j = 0; j < m2[0].length; j++) {
        res[i][j] = num * m2[i][j];
      }
    }
    return res;
  }

  /**
   * 返回(矩阵 * num)的结果
   * 
   * @param m1
   * @param num
   * @return
   */
  public double[][] matrixMultiply(double[][] m1, double num) {
    return matrixMultiply(num, m1);
  }

  /**
   * 返回(num * 矩阵)的结果
   * 
   * @param num
   * @param m2
   * @return
   */
  public double[] matrixMultiply(double num, double[] m2) {
    double[][] m2To = new double[1][1];
    m2To[0] = m2;
    return matrixMultiply(num, m2To)[0];
  }

  /**
   * 返回(矩阵 * num)的结果
   * 
   * @param m1
   * @param num
   * @return
   */
  public double[] matrixMultiply(double[] m1, double num) {
    double[][] m1To = new double[0][0];
    m1To[0] = m1;
    return matrixMultiply(m1To, num)[0];
  }

  /**
   * 返回矩陣中指定的行
   * 
   * @param matrix 矩阵
   * @param row 要获取的行
   * @return
   */
  public double[] getMatrixRow(double[][] matrix, int row) {
    double[] res = new double[matrix[0].length];
    res = Arrays.copyOfRange(matrix[row], 0, matrix[row].length);
    return res;
  }

  /**
   * 返回矩阵中指定的列
   * 
   * @param matrix 矩阵
   * @param col 要获取的列
   * @return
   */
  public double[] getMatrixCol(double[][] matrix, int col) {
    double[] res = new double[matrix.length];
    for (int i = 0; i < matrix.length; i++) {
      res[i] = matrix[i][col];
    }
    return res;
  }

  public void matrixToString(double[][] matrix) {
    for (int i = 0; i < matrix.length; i++) {
      System.out.println(Arrays.toString(matrix[i]));
    }
  }

  public void matrixToString(double[] matrix) {
    double[][] target = new double[1][1];
    target[0] = matrix;
    matrixToString(target);
  }
}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以利用运算符重载来实现矩阵加减乘除操作。以下是一个简单的实现示例: ```c++ #include <iostream> #include <vector> using namespace std; // 矩阵类定义 class Matrix { public: Matrix(int r, int c) : rows(r), cols(c), data(r, vector<double>(c)) {} // 矩阵加法运算符重载 Matrix operator+(const Matrix& other) const { if (this->rows != other.rows || this->cols != other.cols) { throw runtime_error("Matrix dimensions do not match."); } Matrix result(rows, cols); for (int i = 0; i < rows; ++i) { for (int j = 0; j < cols; ++j) { result.data[i][j] = this->data[i][j] + other.data[i][j]; } } return result; } // 矩阵减法运算符重载 Matrix operator-(const Matrix& other) const { if (this->rows != other.rows || this->cols != other.cols) { throw runtime_error("Matrix dimensions do not match."); } Matrix result(rows, cols); for (int i = 0; i < rows; ++i) { for (int j = 0; j < cols; ++j) { result.data[i][j] = this->data[i][j] - other.data[i][j]; } } return result; } // 矩阵乘法运算符重载 Matrix operator*(const Matrix& other) const { if (this->cols != other.rows) { throw runtime_error("Matrix dimensions do not match."); } Matrix result(this->rows, other.cols); for (int i = 0; i < this->rows; ++i) { for (int j = 0; j < other.cols; ++j) { double sum = 0; for (int k = 0; k < this->cols; ++k) { sum += this->data[i][k] * other.data[k][j]; } result.data[i][j] = sum; } } return result; } // 矩阵除法运算符重载 Matrix operator/(const Matrix& other) const { if (this->cols != other.rows) { throw runtime_error("Matrix dimensions do not match."); } Matrix inverse = other.inverse(); // 先求逆矩阵 return (*this) * inverse; // 矩阵乘法实现除法 } // 求逆矩阵 Matrix inverse() const { if (this->rows != this->cols) { throw runtime_error("Matrix is not square."); } int n = this->rows; Matrix result(n, n); // 先做初等变换,将原矩阵变成单位矩阵 for (int i = 0; i < n; ++i) { result.data[i][i] = 1; } for (int i = 0; i < n; ++i) { double factor = this->data[i][i]; for (int j = 0; j < n; ++j) { this->data[i][j] /= factor; result.data[i][j] /= factor; } for (int k = 0; k < n; ++k) { if (k == i) { continue; } double factor = this->data[k][i]; for (int j = 0; j < n; ++j) { this->data[k][j] -= factor * this->data[i][j]; result.data[k][j] -= factor * result.data[i][j]; } } } return result; } private: int rows, cols; // 矩阵行数和列数 vector<vector<double>> data; // 矩阵数据 }; int main() { Matrix A(2, 3); A.data = {{1, 2, 3}, {4, 5, 6}}; Matrix B(3, 2); B.data = {{7, 8}, {9, 10}, {11, 12}}; Matrix C = A + A; C = C - A; Matrix D = A * B; Matrix E = D / B; return 0; } ``` 在上面的示例代码中,我们定义了一个 `Matrix` 类来表示矩阵,并实现矩阵加减乘除四种运算符重载。其中矩阵除法是通过先求逆矩阵再做矩阵乘法实现的。在 `Matrix` 类中还实现了求逆矩阵的函数 `inverse()`,用于求矩阵的逆矩阵

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值