当前位置: 首页 > news >正文

矩阵乘法--Strassen算法

一、矩阵乘法

从中可以看出,计算两个矩阵的乘积,需要三个 for 循环,可以简单写出代码:

	for(int i=1;i<=m;i++)for(int j=1;j<=p;j++)for(int k=1;k<=n;k++)c[i][j]+=a[i][k]*b[k][j];

时间复杂度的分析:很明显,三层for循环迭代,复杂度为 O(n^{3}) 

二、Straasen 算法 

与简单的矩阵乘法计算不同,Strassen算法通过分治操作将运行变快,时间复杂度为 O(n^{log_{2}^{7}})

1.Strassen 算法的原理:

        

 

简单的计算备用矩阵和式 :通过简单的两层for循环将其加减

备用的乘积: 递归调用strassen算法,因为已逐步构造好分块的A和S矩阵,将需要的矩阵作为strassen的输入,就可以得出P矩阵

最后计算将C矩阵的四个分矩阵求出,再合并求得最后的C矩阵

 ①矩阵相加减:

void plus(int **matrixa,int **matrixb,int **matrixc, int x) // 矩阵相加 
{for(int i=1;i<=x;i++)for(int j=1;j<=x;j++)matrixc[i][j]=matrixa[i][j]+matrixb[i][j];
}
void cut(int **matrixa,int **matrixb,int **matrixc,int x1) // 矩阵相减 
{for(int i=1;i<=x1;i++)for(int j=1;j<=x1;j++)matrixc[i][j]=matrixa[i][j]-matrixb[i][j];
}

② 矩阵的拆分(将一个矩阵分成四个小矩阵)与合并:

for(int i=1;i<=newx;i++)
for(int j=1;j<=newx;j++)
{                              a11[i][j]=ma[i][j];a12[i][j]=ma[i][j+newx];a21[i][j]=ma[i+newx][j];a22[i][j]=ma[i+newx][j+newx];b11[i][j]=mb[i][j];b12[i][j]=mb[i][j+newx];b21[i][j]=mb[i+newx][j];b22[i][j]=mb[i+newx][j+newx];
}for(int i=1;i<=newx;i++)
for(int j=1;j<=newx;j++) 
{mc[i][j]=c11[i][j]; mc[i][j+newx]=c12[i][j];mc[i+newx][j]=c21[i][j];mc[i+newx][j+newx]=c22[i][j];
}

 ③递归调用过程:

strassen(a11,s1,p1,newx);
strassen(s2,b22,p2,newx);
strassen(s3,b11,p3,newx);
strassen(a22,s4,p4,newx);
strassen(s5,s6,p5,newx);
strassen(s7,s8,p6,newx);
strassen(s9,s10,p7,newx);

 2.关于Strassen算法的理解:

        Strassen算法的理论推导是比较难的,或者说,是前人不断的试验发现得出的结果,因此需根据得出的公式打出代码。

        代码的难度在于很多地方。

        ①递归的调用:将预处理的代码通过递归计算出。        

        ②二维矩阵的存储以及二维数组在函数中的传递调用:

        因为在递归中的数组是反复调用的,所以一定不能使用全局数组导致计算混乱。

        另一个是二维矩阵的定义,不能简单定义静态数组,定义静态数组过大程序无法运行,并且运行速度慢,而应当定义malloc动态数组数组大小可以改变,而且运行时高效很多

malloc定义二维动态数组:

c=(int **)malloc(sizeof(int *)*n);
for(int i=1;i<=n;i++)c[i]=(int *)malloc(sizeof(int)*n);

三、Strassen 算法的改进

通过上述的理解,可以知道Straasen算法适用于当阶数为 2的幂(或者2的倍数) 时,是否能使其扩大适用范围,让任何相同阶数的矩阵算法都能使用。

当矩阵的阶数为奇数时,只需要将其行列各增加1,并且增加的元素全为0,即可使用 Straasen算法。

改进Strassen算法的复杂度:改进算法并未与原算法发生实质性的改变,因此时间复杂度不发生改变。

相关文章:

矩阵乘法--Strassen算法

一、矩阵乘法 从中可以看出&#xff0c;计算两个矩阵的乘积&#xff0c;需要三个 for 循环&#xff0c;可以简单写出代码&#xff1a; for(int i1;i<m;i)for(int j1;j<p;j)for(int k1;k<n;k)c[i][j]a[i][k]*b[k][j]; 时间复杂度的分析&#xff1a;很明显&#xff0c;…...

Unity笔记:C#基础(1)

杂项 虚函数 CSDN - C虚函数详解 cnblog - C#中的虚函数virtual 常量池与new 在C#中&#xff0c;string是不可变的&#xff0c;这意味着对string对象的操作通常会返回一个新的string对象&#xff0c;而不会修改原始的string对象。因此&#xff0c;几乎所有涉及更改string内…...

计算机科技与心理学的紧密交织:一场跨学科的深度对话

随着信息技术的飞速发展&#xff0c;计算机科学与心理学这两门看似迥异的学科日益呈现出密不可分的关系。本文将深入探讨计算机科学与心理学之间的相互影响和融合&#xff0c;揭示二者在研究方法、应用实践以及对未来社会发展的影响等方面的高度关联性。 计算机科学为心理学研究…...

【JAVA类】利用接口的多继承实现———图书管理系统【附源码】

引言 在我们学习了一些java的基础语法之后&#xff0c;需要把这些知识点可以串起来&#xff0c;这里使用一个简单的小项目可以很好的帮助我们牢记这些知识点&#xff0c;今天就带大家学习一个有关java的小项目&#xff0c;很多学校也经常把这个项目作为他们的课程设计——经典的…...

Linux进程概念僵尸进程孤儿进程

文章目录 一、什么是进程二、进程的状态三、Linux是如何做的&#xff1f;3.1 R状态3.2 S状态3.3 D状态3.4 T状态3.5 t状态3.6 X状态3.7 Z状态 四、僵尸进程4.1 僵尸进程危害 五、孤儿进程 一、什么是进程 对于进程理解来说&#xff0c;在Windows上是也可以观察到的&#xff0c…...

实体店如何引流成交裂变?打造流量新引擎的秘诀

在数字化浪潮席卷的今天&#xff0c;实体店经营面临着前所未有的挑战与机遇。社区店作为连接居民日常生活的桥梁&#xff0c;如何在激烈的市场竞争中脱颖而出&#xff0c;实现引流、成交与裂变&#xff0c;成为摆在每一位实体店创业者面前的重要课题。 作为一名鲜奶吧开店5年的…...

蓝桥杯(日期问题纯暴力)

纯纯暴力&#xff0c;写的想吐&#xff0c;玛德服了。 但是复习了vector去重方法&#xff0c;日期的合法性判断。 #include <iostream> #include <vector> #include <cstring> #include <algorithm>using namespace std; vector<int> res; st…...

ES: ES+Kibana 环境部署

ESKibana 部署 机器信息 10.10.8.62 10.10.8.63 10.10.8.64版本选择&#xff1a;6.8.1 基础环境优化 所有节点 # 关闭防火墙 systemctl stop firewalld.service systemctl disable firewalld.service# 查看selinux getenforce # 关闭selinux setenforce 0 # 永久关闭se…...

Find My产品越来越得到市场认可,伦茨科技ST17H6x芯片赋能厂家

苹果发布AirTag发布以来&#xff0c;大家都更加注重物品的防丢&#xff0c;苹果的 Find My 就可以查找 iPhone、Mac、AirPods、Apple Watch&#xff0c;如今的Find My已经不单单可以查找苹果的设备&#xff0c;随着第三方设备的加入&#xff0c;将丰富Find My Network的版图。产…...

Linux系统——Haproxy高性能负载均衡软件

目录 一、Haproxy介绍 1.Haproxy定义 2.Haproxy主要特性 二、安装Haproxy 1.yum安装 2.第三方rpm包安装 3.编译安装 3.1解决Lua环境 3.2编译安装Haproxy 三、配置文件详解 1.状态页 2.日志管理 2.1定义日志到其他主机站点 3.指定进程线程个数 4.cpu亲缘性 5.多进…...

Python办公自动化之PDF(二)

Python操作PDF二 1、PyMuPDF简介2、 1、PyMuPDF简介 PyMuPDF&#xff08;也称Fitz&#xff09;开源&#xff0c;提供了一整套用于处理PDF文件的综合工具。使用PyMuPDF&#xff0c;用户可以高效地执行打开PDF、提取文本、图像和表格、操作旋转和裁剪等页面属性、创建新PDF文档以…...

登录失败重试次数安全设计方案

1、登录失败重试次数设计方案 1、无论是账号还是密码错误&#xff0c;统一提示&#xff1a;用户名或密码错误&#xff0c;账号剩余登录次数N&#xff01; 2、同一账号连续登录失败5次&#xff0c;锁定该账号5分钟&#xff0c;5分钟后可以再重试登录。 开发设计 key&#xff…...

Django——模板

Django——模板 Django 提供一种动态生成 HTML 页面 —— 模板 1、模板语言 模板语言(DTL): 变量 &#xff0c; 注释 &#xff0c; 标签 &#xff0c; 过滤器 &#xff0c; 模板继承 1、变量 <body> <!-- 这个是前端中的注释 --> {# 这种是Django中模板语言的…...

角蜥优化算法 (Horned Lizard Optimization Algorithm ,HLOA)求解无人机路径优化

一、无人机路径规划模型介绍 无人机三维路径规划是指在三维空间中为无人机规划一条合理的飞行路径,使其能够安全、高效地完成任务。路径规划是无人机自主飞行的关键技术之一,它可以通过算法和模型来确定无人机的航迹,以避开障碍物、优化飞行时间和节省能量消耗。 二、算法介…...

Windows下 OracleXE_21 数据库的下载与安装

Oracle 数据库的下载与安装 数据库安装包下载数据库安装访问数据库进行测试Navicat连接数据库 1. 数据库安装包的下载 1.1 下载地址 Oracle Database Express Edition | Oracle 中国 1.2 点击“下载 Oracle Database XE”按钮&#xff0c;进去到下载页面&#xff08;选择对…...

新手如何快速上手学习单片机?

读者朋友能容我&#xff0c;不使博文负真心 新开专栏&#xff0c;期待与诸君共享精彩 个人主页&#xff1a;17_Kevin-CSDN博客 专栏&#xff1a;《单片机》 学习单片机是一个有趣且有挑战性的过程。单片机是一种微控制器&#xff0c;广泛应用于各种电子设备和嵌入式系统中。在这…...

grpc的验证器

简介 在使用grpc库时候 ,很多时候我们需要对反序列化的参数进行校验,代码中有很多参数校验的代码&#xff0c;如果手动实现&#xff0c;会非常繁琐&#xff0c;对于grpc来说&#xff0c;在定义proto的时候使用直接定义参数的限制规则是一种更合理、更优雅的方式&#xff0c;插…...

无法找到concrt140.dll怎么办?concrt140.dll丢失的5种解决方法

在我们使用计算机的时候&#xff0c;偶尔会遭遇一些技术问题&#xff0c;其中一个比较常见的问题就是出现了"丢失concrt140.dll文件"的提示。当我们的电脑告诉我们缺少了concrt140.dll文件时&#xff0c;常常是因为某些程序无法找到这个文件而导致了程序的运行异常。…...

Elasticsearch 分享

一、Elasticsearch 基础介绍 ElasticSearch 是分布式实时搜索、实时分析、实时存储引擎&#xff0c;简称&#xff08;ES)&#xff0c; 成立于2012年&#xff0c;是一家来自荷兰的、开源的大数据搜索、分析服务提供商&#xff0c;为企业提供实时搜索、数据分析服务&#xff0c;…...

cpu masks的初始化

在内核中&#xff0c;有几个位图变量是用作标识cpu数量和状态的&#xff0c;它们分别是&#xff1a; 变量名称用途循环所使用的宏cpu_possible_mask系统中有多少个可以运行的cpu核for_each_possible_cpucpu_present_mask系统中有多少个可处于运行状态的cpu核for_each_present_…...

Go语言的runtime.GOMAXPROCS限制优化

Go语言的并发性能一直是其核心优势之一&#xff0c;而runtime.GOMAXPROCS作为控制并行度的关键参数&#xff0c;直接影响程序的执行效率。在高并发场景下&#xff0c;合理设置GOMAXPROCS能够显著提升程序性能&#xff0c;但不当的配置也可能导致资源浪费甚至性能下降。本文将深…...

SparkFun LSM6DSV16X 6DoF IMU嵌入式驱动库详解

1. 项目概述SparkFun 6DoF LSM6DSV16X 是一款基于意法半导体&#xff08;STMicroelectronics&#xff09;高性能惯性测量单元&#xff08;IMU&#xff09;LSM6DSV16X 的即插即用型六自由度&#xff08;6DoF&#xff09;传感器模块。该模块集成三轴加速度计与三轴陀螺仪&#xf…...

2026奇点智能技术大会图像识别全栈解密(端侧推理延迟<8ms、零样本泛化准确率提升41.7%实测报告)

第一章&#xff1a;2026奇点智能技术大会&#xff1a;AI原生图像识别 2026奇点智能技术大会(https://ml-summit.org) AI原生图像识别正从“后处理增强”范式全面转向“感知即推理”的新架构——模型在像素输入的首层即启动语义锚定与任务导向的稀疏激活。本届大会首次公开展示…...

C2000系列DSP通过串口实现hex/bin文件远程更新的完整指南

1. 为什么需要串口远程更新DSP程序&#xff1f; 在工业现场调试C2000系列DSP时&#xff0c;经常会遇到这样的困境&#xff1a;设备安装在密闭机柜里&#xff0c;或者部署在高空、危险区域&#xff0c;每次程序更新都需要打开机箱连接JTAG调试器&#xff0c;既费时又存在安全隐患…...

K8s Pod CrashLoopBackOff 根因分析

Kubernetes作为容器编排领域的标杆&#xff0c;其Pod的CrashLoopBackOff状态是运维人员最头疼的问题之一。当Pod反复崩溃重启时&#xff0c;不仅影响业务连续性&#xff0c;还可能隐藏着更深层次的系统隐患。本文将深入剖析这一现象的典型诱因&#xff0c;帮助开发者快速定位问…...

移动端性能优化:启动加速与内存泄漏检测方法

移动端性能优化&#xff1a;启动加速与内存泄漏检测方法 在移动应用开发中&#xff0c;性能优化是提升用户体验的关键环节。启动速度慢和内存泄漏问题直接影响用户留存率和应用稳定性。如何通过技术手段优化启动性能并有效检测内存泄漏&#xff0c;成为开发者关注的焦点。本文…...

用PreScan模拟极端交通场景:如何给自动驾驶算法设计‘马路杀手‘测试用例

用PreScan构建自动驾驶极限测试场景&#xff1a;从参数化设计到算法压力测试 在自动驾驶技术快速迭代的今天&#xff0c;仿真测试已成为算法验证不可或缺的一环。传统测试场景往往局限于标准交通规则下的常规情况&#xff0c;而真实道路上的"马路杀手"——那些不按常…...

NaViL-9B多场景落地:已支撑12家企业完成图文理解AI能力内嵌上线

NaViL-9B多场景落地&#xff1a;已支撑12家企业完成图文理解AI能力内嵌上线 1. 多模态AI新标杆 在当今企业数字化转型浪潮中&#xff0c;能够同时理解文本和图像的多模态AI正成为刚需。NaViL-9B作为原生多模态大语言模型&#xff0c;已经成功帮助12家不同行业的企业实现了图文…...

Agenda嵌入式调度库:抗溢出、协作式Arduino任务管理方案

1. Agenda调度库概述Agenda是一个专为Arduino平台设计的轻量级、非中断驱动型任务调度库&#xff0c;其核心目标是提供一种抗溢出&#xff08;overflow-proof&#xff09;、高可靠性且资源可配置的时间管理方案。该库由Giovanni Blu Mitolo于2013年开发&#xff0c;最初服务于高…...

数据库性能优化:从理论到实践

数据库性能优化&#xff1a;从理论到实践 1. 背景介绍 数据库性能优化是保证应用系统高效运行的关键因素&#xff0c;它直接影响到系统的响应速度、并发处理能力和用户体验。随着数据量的不断增长和业务复杂度的提高&#xff0c;数据库性能优化变得越来越重要。本文将深入探讨数…...