分治法-Strassen-矩阵乘法详细代码

2023-11-02


public class Matrix {

    //初始化一个随机nxn阶矩阵
    public static int[][] initializationMatrix(int n){
        int[][] result = new int[n][n];
        for(int i = 0;i < n;i++){
            for(int j = 0;j < n;j++){
                result[i][j] = (int)(Math.random()*10); //采用随机函数随机生成1~10之间的数
            }
        }
        return result;
    }

    //当n=2是直接求解求解两个2x2和2x2阶矩阵相乘
    public static int[][] MatrixMultiply(int[][] p,int[][] q){
        int[][] result = new int[2][2];
        for(int i=0;i<2;i++){
            for(int j=0;j<2;j++){
                result[i][j] = 0;
                for(int k=0;k<2;k++){
                    result[i][j] += p[i][k]*q[k][j];
                }
            }
        }
        return result;
    }

    //分治法求解两个nxn和nxn阶矩阵相乘
    public static int[][] Strassen(int[][] p,int[][] q,int n){
        int[][] result = new int[n][n];
        //当n为2时,返回矩阵相乘结果
        if(n == 2){
            result = MatrixMultiply(p,q);
            return result;
        }

        //当n大于3时,采用采用分治法,递归求最终结果
        if(n > 2){
            //矩阵拆分为4块
            int[][] A11 = QuarterMatrix(p,n,1);
            int[][] A12 = QuarterMatrix(p,n,2);
            int[][] A21 = QuarterMatrix(p,n,3);
            int[][] A22 = QuarterMatrix(p,n,4);


            //矩阵拆分为4块
            int[][] B11 = QuarterMatrix(q,n,1);
            int[][] B12 = QuarterMatrix(q,n,2);
            int[][] B21 = QuarterMatrix(q,n,3);
            int[][] B22 = QuarterMatrix(q,n,4);

            int[][] M1 = Strassen(A11, SubMatrix(B12, B22,n/2),n/2);

            int[][] M2 = Strassen(AddMatrix(A11, A12,n/2), B22 ,n/2);
            int[][] M3 = Strassen(AddMatrix(A21, A22,n/2), B11,n/2);
            int[][] M4 = Strassen(A22, SubMatrix(B21, B11,n/2),n/2);
            int[][] M5 = Strassen(AddMatrix(A11, A22, n/2), AddMatrix(B11, B22,n/2),n/2);
            int[][] M6 = Strassen(SubMatrix(A12, A22, n/2), AddMatrix(B21, B22,n/2),n/2);
            int[][] M7 = Strassen(SubMatrix(A11, A21, n/2), AddMatrix(B11, B12,n/2),n/2);

            int[][] C11 = AddMatrix(SubMatrix(AddMatrix(M5, M4, n/2), M2,n/2), M6, n/2);
            int[][] C12 = AddMatrix(M1, M2, n/2);
            int[][] C21 = AddMatrix(M3, M4, n/2);
            int[][] C22 = SubMatrix(SubMatrix(AddMatrix(M1, M5, n/2), M3, n/2), M7, n/2);

            result = TogetherMatrix(C11, C12, C21, C22,n/2);
        }
        return result;
    }

    //获取矩阵的四分之一,并决定返回哪一个四分之一
    public static int[][] QuarterMatrix(int[][] p,int n,int number){
        int rows = n/2;   //行数减半
        int cols = n/2;   //列数减半
        int[][] result = new int[rows][cols];
        switch(number){
            case 1 :
            {
                // result = new int[rows][cols];
                for(int i=0;i<rows;i++){
                    for(int j=0;j<cols;j++){
                        result[i][j] = p[i][j];
                    }
                }
                break;
            }

            case 2 :
            {
                // result = new int[rows][n-cols];
                for(int i=0;i<rows;i++){
                    for(int j=0;j<n-cols;j++){
                        result[i][j] = p[i][j+cols];
                    }
                }
                break;
            }

            case 3 :
            {
                // result = new int[n-rows][cols];
                for(int i=0;i<n-rows;i++){
                    for(int j=0;j<cols;j++){
                        result[i][j] = p[i+rows][j];
                    }
                }
                break;
            }

            case 4 :
            {
                // result = new int[n-rows][n-cols];
                for(int i=0;i<n-rows;i++){
                    for(int j=0;j<n-cols;j++){
                        result[i][j] = p[i+rows][j+cols];
                    }
                }
                break;
            }
            default:
                break;
        }

        return result;
    }

    //把均分为四分之一的矩阵,聚合成一个矩阵,其中矩阵a,b,c,d分别对应原完整矩阵的四分中1、2、3、4
    public static int[][] TogetherMatrix(int[][] a,int[][] b,int[][] c,int[][] d,int n){
        int[][] result = new int[2*n][2*n];
        for(int i=0;i<2*n;i++){
            for(int j=0;j<2*n;j++){
                if(i<n){
                    if(j<n){
                        result[i][j] = a[i][j];
                    }
                    else
                        result[i][j] = b[i][j-n];
                }
                else{
                    if(j<n){
                        result[i][j] = c[i-n][j];
                    }
                    else{
                        result[i][j] = d[i-n][j-n];
                    }
                }
            }
        }

        return result;
    }


    //求两个矩阵相加结果
    public static int[][] AddMatrix(int[][] p,int[][] q,int n){
        int[][] result = new int[n][n];
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                result[i][j] = p[i][j]+q[i][j];
            }
        }
        return result;
    }

    public static int[][] SubMatrix(int[][] p,int[][] q,int n){
        int[][] result = new int[n][n];
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                result[i][j] = p[i][j]-q[i][j];
            }
        }
        return result;
    }

    //控制台输出矩阵
    public static void PrintfMatrix(int[][] matrix,int n){
        for(int i=0;i<n;i++){
            System.out.println();
            for(int j=0;j<n;j++){
                System.out.print("\t");
                System.out.print(matrix[i][j]);
            }
        }

    }

    public static void main(String args[]){
        int n = 8;
        int[][] p = initializationMatrix(n);
        int[][] q = initializationMatrix(n);
        System.out.print("矩阵p初始化值为:");
        PrintfMatrix(p,n);
        System.out.println();
        System.out.print("矩阵q初始化值为:");
        PrintfMatrix(q,n);

        int[][] dac_result = Strassen(p,q,n);
        System.out.println();
        System.out.print("分治法计算矩阵p*q结果为:");
        PrintfMatrix(dac_result,n);
    }

}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

分治法-Strassen-矩阵乘法详细代码 的相关文章

  • 请问在CSS里面,这个符号是什么 意思?

    是HTML注释 不是CSS注释 CSS是 之所以会有人这么写是因为有的浏览器不支持CSS CSS的标记就会被直接显示出来 用HTML注释掉是为了确保兼容性 而那些支持CSS的浏览器就可以正确解析了 追问 那请问我在什么地方都用就可以了吗 回
  • 开放-封闭原则

    一 定义 开放 封闭原则 是说软件实体 类 模块 函数等等 应该是可扩展的 但是不可修改 ASD 这个原则其实是有两个特征 一个是说 对于扩展是开放的 Open for extension 对于更改是封闭的 Closed for modif
  • java语言利用正则表达式判断身份证号码合法性

    判断身份证 要么是15位 要么是18位 最后一位可以为字母 并写程序提出其中的年月日 我们可以用正则表达式来定义复杂的字符串格式 d 17 0 9a zA Z d 14 0 9a zA Z 可以用来判断是否为合法的15位或18位身份证号码
  • AI人像抠图及图像合成:让你一键环游世界

    本程序基于百度飞浆 PaddlePaddle 平台完成 该程序通过DeepLabv3 模型完成一键抠图 encoder decoder进行多尺度信息的融合 同时保留了原来的空洞卷积和ASSP层 其骨干网络使用了Xception模型 提高了语

随机推荐

  • conda activate base报错Your shell has not been properly configured to use ‘conda activate‘.

    conda activate base报错Your shell has not been properly configured to use conda activate 使用conda activate base激活base环境时 出现
  • HTTP缓存机制

    缓存的作用 提高资源加载速度 减少网络请求 提高页面渲染速度 缓存的分类 前端缓存主要包括http缓存 数据缓存 HTTP缓存 常见的 HTTP 缓存只能存储 GET 响应 对于其他类型的响应则无能为力 浏览器在每次GET URL时都会先检
  • 【车联网原型系统|二】数据库+应用层协议设计

    物联网原型系统导航 车联网原型系统 一 项目介绍 需求分析 概要设计 https blog csdn net weixin 46291251 article details 125807297 车联网原型系统 二 数据库 应用层协议设计 h
  • Excel里关于if的9个函数,如何指定条件求和、计数、平均等

    总结了一下Excel里的求满足条件的计数 求和 平均值 最大值 最小值 标准差等9个方法 01 countif 作用 对满足条件的区域统计个数 模板 countif 条件所在的区域 条件 实例 A B列是广东不同地市的得分评价情况 在E2单
  • labelme标注结果可视化(持续补充)

    图像数据常用的标注工具是labelme 标注的格式是json labelme标注结果可视化 是将标注结果绘制到原始图像上 以方便查看标注结果 1 json文件读取与保存 由于labelme标注的保存格式为json 所以必须掌握json文件的
  • 【已解决】SpringBoot整合security账号密码正确却提示错误

    已解决 SpringBoot整合security账号密码正确却提示错误 一 引言 SpringSecurity的密码校验并不是直接使用原文进行比较 而是使用加密算法将密码进行加密 更准确地说应该进行Hash处理 此过程是不可逆的 无法解密
  • react 是怎么运行的?

    react 是怎么运行的 import React from react import ReactDOM from react dom const App div style color 000000 hello world div con
  • 如何完全删除,删的可以重新下载新的MySQL·

    第一步 快捷键win r输入regedit进入注册表 找到HKEY LOCAL MACHINE SYSTEM ControlSet001 Services Eventlog Application MySQL文件夹删除 删除HKEY LOC
  • 程序员精进之路:性能调优利器--火焰图

    本文主要分享火焰图使用技巧 介绍 systemtap 的原理机制 如何使用火焰图快速定位性能问题原因 同时加深对 systemtap 的理解 让我们回想一下 曾经作为编程新手的我们是如何调优程序的 通常是在没有数据的情况下依靠主观臆断来瞎蒙
  • Docker 镜像使用基本操作

    今天我将围绕 Docker 核心概念镜像展开 首先重点讲解一下镜像的基本操作 然后介绍一下镜像的实现原理 首先说明 咱们本课时的镜像均指 Docker 镜像 你是否还记得镜像是什么 我们先回顾一下 镜像是一个只读的 Docker 容器模板
  • 作为网络工程师,你知道私有IP地址范围吗?

    RFC 1918定义了私有IP的范围私有 内网 IP地址范围 A类 10 0 0 0 10 255 255 255B类 172 16 0 0 172 31 255 255C类 192 168 0 0192 168 255 255 提高 RF
  • C++ string的用法和例子

    https blog csdn net tengfei461807914 article details 52203202 string是C 标准库的一个重要的部分 主要用于字符串处理 可以使用输入输出流方式直接进行操作 也可以通过文件等手
  • LinearAlgebraMIT_6_ColumnSpaceAndNullSpace

    这节课的两个重点是column space列空间和null space零空间 x 1 pre multiply left multiply and post multiply right multiply 对于pre multiply le
  • 了解MQ和安装使用RabbitMQ

    什么是消息队列 本质是一个队列 队列中出存放的是跨进程的通信机制 用于上下游传递消息 MQ是常见的上下游 逻辑解耦 物理解耦 的消息通信服务 在使用MQ之后 消息发送上只需要依赖MQ 不用依赖其他服务 功能 1 流量削峰 举个例子 系统最多
  • 最新抖音快手小红书西瓜全平台解析接口api开发文档

    简介 从短视频平台APP中复制出来的分享链接 通过接口获取或通过主页在线一键解析获取短视频中的 视频标题 视频封面 无水印视频地址 图集列表等参数信息 接口地址 https eeapi cn 返回格式 JSON 请求方式 GET 客户UId
  • 常见的Java框架有哪些?

    作为一名合格的Java开发工程师 不仅需要了解开发技术 还需要了解清楚Java主流框架信息 那么常见的Java框架有哪些 常见的Java框架有哪些 1 Spring框架 Spring框架是现在Java后端框架家族里面最强大的一个 拥有IOC
  • 【PTA】约瑟夫环问题

    n个小孩围成一圈 从第一个小孩开始从1到m报数 报到m的小孩出列 下一个小孩继续从1开始报数 出列的小孩不参与报数 问小孩的出列顺序 import java util public class Main public static void
  • 【Proteus仿真】【51单片机】简易信号发生器设计

    文章目录 一 主要功能 二 使用方法 三 硬件资源 四 软件设计 1 主要代码 五 实验现象 联系作者 一 主要功能 1 可生成常用波形 方波 锯齿波 三角波 阶梯波 正玄波 2 可通过按键切换不同波形输出 二 使用方法 系统运行后 按下K
  • 如何在git中修改用户名和密码

    随着开源软件的不断发展 git已成为了极其流行的版本控制系统 git是一个非常强大的工具 引入了一系列的概念和机制 便于软件工程师跟踪他们的代码变化 这篇文章将会谈论如何在git中修改用户名和密码 git是什么 Git是一个由Linus T
  • 分治法-Strassen-矩阵乘法详细代码

    public class Matrix 初始化一个随机nxn阶矩阵 public static int initializationMatrix int n int result new int n n for int i 0 i lt n