Java实现的矩阵乘法示例

本文实例讲述了Java实现的矩阵乘法。分享给大家供大家参考,具体如下:

思路:

矩阵乘法的前提是:前一矩阵的行数 == 后一矩阵的列数(rows == cols)

在满足前提的情况下:前一矩阵的第一行 与 第二个矩阵的第一列 逐个相乘。将乘积求和 作为 结果矩阵的第一个元素

类推刻得到:结果矩阵的 第 [row][col] 个元素 = 前一矩阵的第 row 行 与 后一矩阵的 col列上的元素 逐一相乘 后的乘积之和

代码及解析:

一、算法剖析:

1.设置两个for循环用来控制结果(输出)矩阵的 待赋值元素位置 (即 matrix[i][j] )

2.在这两个循环环中再嵌套上一个循环 这个循环起到关键作用 它用来控制 前一矩阵第 i 行元素的列数 以及 后一矩阵 第 j 列的行数

二、算法代码:

​/*
 * 计算两个矩阵相乘的方法
 */
public Matrix mutiply(Matrix m){
    Matrix result = new Matrix(this.getRows(), m.getCols());
    for (int i = 0 ; i < this.getRows() ; i++ ){
        for(int j = 0 ; j < m.getCols() ; j++ ){//正好为矩阵大小,保证了每个元素都被赋值
            for (int num = 0 ; num < this.getCols() ; num++){
                result.setData(i, j, this.getData(i, num) * m.getData(num, j));
            }
        }
    }
    return result;
}

注:具体进行计算时,由于可能出现 前一矩阵行数 不等于 后一矩阵列数等异常情况

需要进行异常处理,这里为了保证算法过程的清晰性暂不加上,希望读者在具体使用中及时添加。

源码即测试范例:

public class MatrixTest {
    public static void main(String[] args) {
        //矩阵测试范例
        //仅为输入参考 无实际作用
        double [][]array01 = {
                {1, 2, 3},
                {4, 5, 6}
        };
        double [][]array02 = {
                {1, 4},
                {2, 5},
                {3, 6}
        };
        double [][] resultMatrix = new double[array01.length][array02[0].length];
        for (int i = 0 ; i < resultMatrix.length ; i++ ){
            for(int j = 0 ; j < resultMatrix[0].length ; j++ ){//正好为矩阵大小,保证了每个元素都被赋值
                for (int num = 0 ; num < array02.length ; num++){
                        resultMatrix[i][j] = resultMatrix[i][j] + array01[i][num]*array02[num][j];
                }
            }
        }

        for (int i = 0 ; i < resultMatrix.length ; i++ ){
            for(int j = 0 ; j < resultMatrix[0].length ; j++ ){//正好为矩阵大小,保证了每个元素都被赋值
                System.err.print(resultMatrix[i][j] + "\t");
            }
            System.out.println();
        }
    }
}

输出范例:

9.0   18.0
18.0   36.0

更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。

(0)

相关推荐

  • Java掩码的几种使用例举

    java掩码 private static String nameMask(String name) throws Exception { if(name ==null)throw new Exception("请输入要掩码的字符串"); if(name.length()<=1) return name+"*"; return name.replaceAll("([\\u4e00-\\u9fa5]{1})(.*)", "$1&qu

  • Java调用shell脚本解决传参和权限问题的方法

    1. java 执行shell java 通过 Runtime.getRuntime().exec() 方法执行 shell 的命令或 脚本,exec()方法的参数可以是脚本的路径也可以是直接的 shell命令 代码如下(此代码是存在问题的.完整代码请看2): /** * 执行shell * @param execCmd 使用命令 或 脚本标志位 * @param para 传入参数 */ private static void execShell(boolean execCmd, String

  • Java抛出异常与自定义异常类应用示例

    本文实例讲述了Java抛出异常与自定义异常类.分享给大家供大家参考,具体如下: 异常处理常用方法: 常用的异常处理方法有: 一.try()catch() 语句 二.throw / throws 语句 三.自定义异常类 用途: 众所周知,当程序运行过程中,如果遇到了错误(比如数组下标越界,空指针等)程序就会自动终止,但这种错误一般是偶然的,可能是用户输入不呵呵程序编写者的意图导致,而不是程序本身问题,这是我们要做的,是让操作者知道发生了什么事情,而不是直截了当的结束程序,这时我们就用到了异常处理(

  • 在spring boot中使用java线程池ExecutorService的讲解

    1. 认识java线程池 1.1 在什么情况下使用线程池? 1.单个任务处理的时间比较短 2.需处理的任务的数量大 1.2 使用线程池的好处: 1.减少在创建和销毁线程上所花的时间以及系统资源的开销 2.如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存 1.3 线程池包括以下四个基本组成部分: 1.线程池管理器(ThreadPool):用于创建并管理线程池,包括 创建线程池,销毁线程池,添加新任务: 2.工作线程(PoolWorker):线程池中线程,在没有任务时处于等待状态,可以

  • Java for循环详解

    对于java中的for循环,我们用的最多的无非就是下面这个语句: for (int i = 0; i < 10; i++) { System.err.println(i); } 但是对于for循环来说,它也有很多变体,如果不清楚了解for循环的结构原理,遇上一些变体的for循环,可能一时不太明白它的含义,for循环虽然有很多变体,但都离不开括号内3条语句的模式(除了增强for循环模式,后面再讨论) for循环的结构: for(语句A; 语句B; 语句C){ //循环体 } 其中,语句A在整个循环

  • Java位掩码控制权限与(&)或(|)非(~)、>的介绍

    1. java 位掩码 java 位掩码,在java开发中很少有场景会用到掩码,但是当系统中需要判断某个对象是否有 某些权限时,可以通过位掩码来做. 位掩码 主要通过位运算,例如与(&).非(~).或(|).异或(^).移位(<<和>>)等来实现 权限判断功能. 1.1 简单介绍一下位运算符(计算均为二进制计算) << : 左移运算符,num << 1,相当于num乘以2 >> : 右移运算符,num >> 1,相当于num除

  • JavaScript碎片—函数闭包(模拟面向对象)

    经过这几天的博客浏览,让我见识大涨,其中有一篇让我感触犹深,JavaScript语言本身是没有面向对象的,但是那些大神们却深深的模拟出来了面向对象,让我震撼不已.本篇博客就是在此基础上加上自己的认知,如有错误,还请见谅. 具体来说实现模拟面向对象主要是利用JavaScript函数闭包这个概念.由于JavaScript中的每一个function都会形成一个作用域,而如果变量声明在这个域中,那么外部是无法直接去访问,要想访问必须new出一个实例来,相当于Java中class.首先让我们来了解一下pr

  • 浅谈Java之终止继承:Final类和Fianl方法

    前言 关键字Final不仅可以用来修饰变量,而且对类及其方法的继承也有很大的影响,本文将从类与方法两个方面介绍final关键字的功能. Final类 当关键字final用来修饰类时,其含义是该类不能再派生子类,换句话说,任何其他类都不能继承用final修饰的类,即使该类的访问权限为pubilc类型,也不能被继承:否则,将编译报错. 只有当需要确保类中的方法都不被重写时才应该建立最终(final)类,final关键字将会为这些方法提供安全,没有任何人能够重写final类中的方法,因为不能继承. 例

  • java与php的区别浅析

    java的简单介绍 Java是一种通用的面向对象编程语言,旨在生成可在任何地方使用相同代码的代码.这种编程语言是基于类的,面向对象的和人类可读的.它支持服务器端和客户端. Java既可以编译也可以解释.Java编译器将源代码转换为字节码,然后java解释器生成机器代码,该机器代码由运行java程序的机器直接执行.它可靠,分布式,便携.它可用于开发独立应用程序或基于Web的应用程序. PHP的简单介绍 PHP被称为超文本预处理器,它是一种服务器端脚本语言.它是一种动态类型语言,不需要编译代码:它是

  • 深入理解Java高级特性——注解

    博主在初学注解的时候看到网上的介绍大部分都是直接介绍用法或者功能,没有实际的应用场景,篇幅又很长导致学习的时候难以理解其意图,而且学完就忘QAQ.本篇文章中我将结合实际的应用场景尽可能由浅入深,平缓的介绍java注解. java注解是jdk1.5以后新出的特性,对于它的应用非常广泛,我们首先来看一下注解的应用,百度百科上这样说: 我们可以看到,注解的作用有三方面: 编写doc文档:这个就我们很常用的 @return 以及 @author,加了这些注解以后,就可以用jdk帮我们自动生成对应的API

随机推荐