基本矩阵运算的Java实现

简介: 基本矩阵运算的Java实现

一: 矩阵的加法与减法

规则:矩阵的加法与减法要求两个矩阵的行列完全相等,方可以完成两个矩阵的之间的运算。

举例说明如下

1347936016_4238.png

二:矩阵的乘法

规则:矩阵的乘法要求两个矩阵符合A(mx k),  B( k x n)即矩阵A的列数与矩阵B的行数相等,否

则无法完成矩阵运算。举例说明如下:

1347936033_6743.png

Java代码如下:

package pet.shop;
 
public class BasicMatrixMath {
  public final static int OPERATION_ADD = 1;
  public final static int OPERATION_SUB = 2;
  public final static int OPERATION_MUL = 4;
  
  /**
   * To be able to add two matrices, they must be of the same size
   * @param matrixa
   * @param matrixb
   */
  public int[][] add(int[][] matrixa, int[][] matrixb) {
    if(legalOperation(matrixa, matrixb, OPERATION_ADD)) {
      for(int i=0; i<matrixa.length; i++) {
        for(int j=0; j<matrixa[0].length; j++) {
          matrixa[i][j] = matrixa[i][j] + matrixb[i][j];
        }
      }
    }
    return matrixa;
  }
  
  /**
   * To be able to substract two matrices, they must be of the same size
   * 
   * @param matrixa
   * @param matrixb
   */
  public int[][] substract(int[][] matrixa, int[][] matrixb) {
    if(legalOperation(matrixa, matrixb, OPERATION_SUB)) {
      for(int i=0; i<matrixa.length; i++) {
        for(int j=0; j<matrixa[0].length; j++) {
          matrixa[i][j] = matrixa[i][j] - matrixb[i][j];
        }
      }
    }
    return matrixa;
  }
  
  /**
   * 
   * @param matrixa
   * @param matrixb
   */
  public int[][] multiplication(int[][] matrixa, int[][] matrixb) {
    if(legalOperation(matrixa, matrixb, OPERATION_SUB)) {
      int[][] result = new int[matrixa.length][matrixb[0].length];
      for(int i=0; i<matrixa.length; i++) {
        for(int j=0; j<matrixb[0].length; j++) {
          // i will complete this tomorrow @2012/09/17
          result[i][j] = calculateSingleResult(matrixa, matrixb, i, j); 
        }
      }
      return result;
    } 
    else
    {
      return null;
    }
  }
  
  private int calculateSingleResult(int[][] matrixa, int[][] matrixb, int row, int col) {
    int result = 0;
    for(int k=0; k<matrixa[0].length; k++) {
      result += matrixa[row][k] * matrixb[k][col];
    }
    return result;
  }
 
  /**
   * 
   * @param matrixa
   * @param b
   */
  public int[][] multiplication(int[][] matrixa, int b) {
    for(int i=0; i<matrixa.length; i++) {
      for(int j=0; j<matrixa[0].length; j++) {
        matrixa[i][j] = matrixa[i][j] * b;
      }
    }
    return matrixa;
  }
  
  /**
   * validate whether the parameters is valid parameters.
   * 
   * @param a
   * @param b
   * @param type
   * @return
   */
  private boolean legalOperation(int[][] a, int[][] b, int type) {
    boolean legal = true;
    if(type == OPERATION_ADD || type == OPERATION_SUB)
    {
      if(a.length != b.length || a[0].length != b[0].length) {
        legal = false;
      }
    } 
    else if(type == OPERATION_MUL)
    {
      if(a[0].length != b.length) {
        legal = false;
      }
    }
    return legal;
  }
  
  /**
   *  test code here !!!!
   * @param args
   */
  public static void main(String[] args) {
    int[][] a = new int[][]{{1,2},{3,4}};
    int[][] b = new int[][]{{7, 8}, {6, 5}};
    BasicMatrixMath bmm = new BasicMatrixMath();
    
    System.out.println("addition two matrix");
    int[][] result = bmm.add(a, b);
    for(int i=0; i<result.length; i++) {
      for(int j=0; j<result[0].length; j++) {
        System.out.print("\t" + result[i][j]);
      }
      System.out.println();
    }
    
    System.out.println("substract two matrix");
    result = bmm.substract(a, b);
    for(int i=0; i<result.length; i++) {
      for(int j=0; j<result[0].length; j++) {
        System.out.print("\t" + result[i][j]);
      }
      System.out.println();
    }
    
    System.out.println("multiplex one matrix");
    result = bmm.multiplication(a, 3);
    for(int i=0; i<result.length; i++) {
      for(int j=0; j<result[0].length; j++) {
        System.out.print("\t" + result[i][j]);
      }
      System.out.println();
    }
    
    System.out.println("multiplex two matrix");
    result = bmm.multiplication(a, b);
    for(int i=0; i<result.length; i++) {
      for(int j=0; j<result[0].length; j++) {
        System.out.print("\t" + result[i][j]);
      }
      System.out.println();
    } 
  }
}

相关文章
|
Java
基本矩阵运算的Java实现
一: 矩阵的加法与减法 规则:矩阵的加法与减法要求两个矩阵的行列完全相等,方可以完成两个矩阵的之间的运算。 举例说明如下 二:矩阵的乘法 规则:矩阵的乘法要求两个矩阵符合A(mx k),  B( k x n)即矩阵A的列数与矩阵B的行数相等,否 则无法完成矩阵运算。
1797 0
|
4天前
|
Java 机器人 程序员
Java中的线程通信:wait、notify与Condition详解
Java中的线程通信:wait、notify与Condition详解
|
1天前
|
监控 安全 算法
如何有效地处理Java中的多线程
如何有效地处理Java中的多线程
|
2天前
|
Java 调度
Java多线程编程与并发控制策略
Java多线程编程与并发控制策略
|
2天前
|
安全 算法 Java
java多线程面试题2019整理
java多线程面试题2019整理
|
2天前
|
安全 Java 开发者
Java并发编程:理解并发与多线程
在当今软件开发领域,Java作为一种广泛应用的编程语言,其并发编程能力显得尤为重要。本文将深入探讨Java中的并发编程概念,包括多线程基础、线程安全、并发工具类等内容,帮助开发者更好地理解和应用Java中的并发特性。
6 1
|
3天前
|
监控 Java 调度
Java并发编程:深入理解线程池
【6月更文挑战第26天】在Java并发编程的世界中,线程池是提升应用性能、优化资源管理的关键组件。本文将深入探讨线程池的内部机制,从核心概念到实际应用,揭示如何有效利用线程池来处理并发任务,同时避免常见的陷阱和错误实践。通过实例分析,我们将了解线程池配置的策略和对性能的影响,以及如何监控和维护线程池的健康状况。
7 1
|
16小时前
|
安全 Java 开发者
Java并发编程中的线程安全策略
在现代软件开发中,Java语言的并发编程特性使得多线程应用成为可能。然而,随着线程数量的增加,如何确保数据的一致性和系统的稳定性成为开发者面临的挑战。本文将探讨Java并发编程中实现线程安全的几种策略,包括同步机制、volatile关键字的使用、以及java.util.concurrent包提供的工具类,旨在为Java开发者提供一系列实用的方法来应对并发问题。
7 0
|
1天前
|
存储 缓存 Java
Java并发编程之线程池的使用
Java并发编程之线程池的使用
|
2天前
|
安全 Java 调度
精通Java中的线程同步与互斥
精通Java中的线程同步与互斥