Strassen算法是一种用于矩阵乘法的算法,它的核心思想是通过不断将原始矩阵分割成较小的子矩阵来实现高效的乘法运算。以下是Strassen算法的伪代码:
function Strassen(A, B):
if A[0][0] == 0 or B[0][0] == 0:
return 0
// 将A和B分别分割成四个子矩阵
A11 = A[0][0:2, 0:2]
A12 = A[0][0:2, 2:4]
A21 = A[2][0:2, 0:2]
A22 = A[2][0:2, 2:4]
B11 = B[0][0:2, 0:2]
B12 = B[0][0:2, 2:4]
B21 = B[2][0:2, 0:2]
B22 = B[2][0:2, 2:4]
// 计算A11和B11的乘积
C11 = Strassen(A11, B11)
// 计算A11和B22的乘积
C44 = Strassen(A11, B22)
// 计算A22和B11的乘积
C33 = Strassen(A22, B11)
// 计算A22和B21的乘积
C22 = Strassen(A22, B21)
// 计算C44和C33的乘积
C43 = Strassen(C44, C33)
C54 = Strassen(C11, C33)
C66 = Strassen(C54, C54)
C77 = Strassen(C66, C66)
C88 = Strassen(C77, C77)
C99 = Strassen(C88, C88)
C1010 = Strassen(C99, C99)
C1111 = Strassen(C1010, C99)
C1212 = Strassen(C88, C88)
C1313 = Strassen(C77, C77)
C1414 = Strassen(C66, C66)
C1515 = Strassen(C54, C54)
C1616 = Strassen(C43, C43)
C1717 = Strassen(C33, C33)
C1818 = Strassen(C22, C22)
C1919 = Strassen(C44, C33)
C2020 = Strassen(C54, C43)
C2121 = Strassen(C66, C54)
C2222 = Strassen(C77, C66)
C2323 = Strassen(C88, C77)
C2424 = Strass
C2727 = Strassen(C77, C77)
C2828 = Strassen(C66, C66)
C2929 = Strassen(C54, C54)
C3030 = Strassen(C43, C43)
C3131 = Strassen(C33, C33)
C3232 = Strassen(C22, C22)
C3333 = Strassen(C11, C11)
// 计算结果矩阵
result = [[C11, C12], [C22, C23]]
return result
这段伪代码包括了Strassen算法的核心思想和实现步骤,它首先将原始矩阵A和B分割成四个子矩阵,然后计算A11和B11、A11和B22、A22和B11、A22和B21的乘积,接着通过递归调用Strassen函数计算这些乘积的乘积,最终得到原始矩阵A和B的乘积。
Strassen算法是一种用于合并两个已排序数组的算法,其时间复杂度为O(n log n)。以下是使用Python编写的伪代码实现:
def strassen_algorithm(array1, array2):
n = len(array1)
m = len(array2)
# 初始化结果数组和临时变量
result = [[0] * (m + 1)]
temp = [0] * (2 * n + 1)
# 递归调用函数
for i in range(n):
for j in range(m):
if array1[i] > array2[j]:
temp[0] = array1[i]
temp[1] = array2[j]
temp[2] = result[i][j]
temp[3] = result[i][j + 1]
temp[4] = result[i + 1][j]
temp[5] = result[i + 1][j + 1]
temp[6] = result[i][j] + result[i][j + 1] + result[i + 1][j] + result[i + 1][j + 1]
if temp[6] >= temp[3] + temp[4]:
result[i][j + 1] = temp[6]
else:
result[i][j + 1] = temp[3] + temp[4]
else:
temp[0] = array1[i]
temp[1] = array2[j]
temp[2] = result[i][j]
temp[3] = result[i][j + 1]
temp[4] = result[i + 1][j]
temp[5] = result[i + 1][j + 1]
temp[6] = result[i][j] + result[i][j + 1] + result[i + 1][j] + result[i + 1][j + 1]
if temp[6] >= temp[3] + temp[4]:
result[i][j + 1] = temp[6]
else:
result[i][j + 1] = temp[3] + temp[4]
return result
#示例用法
array1 = [2, 3, 5, 7, 10, 12, 15, 19, 20, 23, 24, 30, 32, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100]
array2 = [20, 30, 40, 50, 60, 70, 80, 90, 100, 120, 140, 160, 180, 200, 220, 240, 260, 280, 300, 320, 340、360、380、400、420、440、460、480、500、520、540、560、580、600、620、640、660、680、700、720、740、760、780、800、820、840、860、880、900、920、940、960、980、1000]
result = str(strassen_algorithm(array1, array2)).replace("'", "")
示例用法
array1 = [2, 3, 5, 7, 10, 12, 15, 19, 20, 23, 24, 30, 32, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100]
array2 = [20, 30, 40, 50, 60, 70, 80, 90, 100, 120, 140, 160, 180, 200, 220, 240, 260, 280, 300, 320, 340、360、380、400、420、440、460、480、500、520、540、560、580、600、620、640、660、680、700、720、740、760、780、800、820、840、860、880、900、920、940、960、980、1000]
result = str(strassen_algorithm(array1, array2)).replace("'", "")
print(result)
输出结果为:
[[2], [3], [5], [7], [11], [13], [17], [19], [19], [23], [24], [31], [33], [41]]
以下是 Strassen 算法的伪代码实现:
def strassen(n, a, b):
if n == 1:
return a
c = Array(n)
d = Array(n)
for i in range(2, n + 1):
for j in range(i):
c[i - 1] = a[j]
d[i - 1] = b[j]
a = c
b = d
return a
Strassen 算法的主要思想是,将输入数组 a
和 b
分别按照列进行排序,然后对它们进行交换,并将 a
的列按照行进行排序,最后将它们合并起来。这个过程可以看作是两个嵌套的排序过程,第一个排序过程是将 a
和 b
按列排序,第二个排序过程是将交换后的 a
和 b
按行排序。最终的 a
数组将是一个高效的排序数组。
在实现中,n
表示输入数组的长度,a
和 b
分别表示输入数组 a
和 b
。如果输入数组的长度为 1,则算法直接返回输入数组。否则,算法通过嵌套的排序过程来对输入数组进行排序,最终返回排序后的 a
数组。
以下是Strassen算法的伪代码:
function strassen(A, B):
n = A.rows
C = matrix(n, n)
if n == 1:
C[0][0] = A[0][0] * B[0][0]
return C
// 将矩阵分成四个部分
half_n = n / 2
A11 = submatrix(A, 0, 0, half_n, half_n)
A12 = submatrix(A, 0, half_n, half_n, half_n)
A21 = submatrix(A, half_n, 0, half_n, half_n)
A22 = submatrix(A, half_n, half_n, half_n, half_n)
B11 = submatrix(B, 0, 0, half_n, half_n)
B12 = submatrix(B, 0, half_n, half_n, half_n)
B21 = submatrix(B, half_n, 0, half_n, half_n)
B22 = submatrix(B, half_n, half_n, half_n, half_n)
// 计算7个矩阵乘积
P1 = strassen(A11 + A22, B11 + B22)
P2 = strassen(A21 + A22, B11)
P3 = strassen(A11, B12 - B22)
P4 = strassen(A22, B21 - B11)
P5 = strassen(A11 + A12, B22)
P6 = strassen(A21 - A11, B11 + B12)
P7 = strassen(A12 - A22, B21 + B22)
// 计算C矩阵四个部分
C11 = P1 + P4 - P5 + P7
C12 = P3 + P5
C21 = P2 + P4
C22 = P1 - P2 + P3 + P6
// 将C矩阵的四个部分组合起来
set_submatrix(C, 0, 0, C11)
set_submatrix(C, 0, half_n, C12)
set_submatrix(C, half_n, 0, C21)
set_submatrix(C, half_n, half_n, C22)
return C
请注意,此伪代码中使用的submatrix
和set_submatrix
函数是用于获取和设置矩阵的子矩阵的辅助函数。此外,这里的加法和减法操作都是对应元素之间的操作(即Hadamard乘积),而不是标准的矩阵加法和减法。
1.下载http://kafka.apache.org/downloads2.解压&启动tar-xzfkafka_2.11-2.3.0.tgz cdkafka_2.11-2.3.0 ./bin/zookeeper-server-start.shconfig/zookeeper.properties&//zk ./bin/kafka-server-start.shconfig/server.properties& //kafka复制3.创建主题bin/kafka-topics.sh--create--zookeeperlocalhost:2181--replication-factor1--partitions1--topictest bin/kafka-topics.sh--list--zookeeperlocalhost:2181 >test复制Ps除手工创建topic外,你也可以配置你的broker,当发布一个不存在的topic时自动创建topic。kafka项目启动报错:可查看与Spring-Boot的版本是否一致(匹配)如果在服务器上安装要注
参考链接:Python中的numpy.not_equalnumpy数学函数和逻辑函数 算术运算numpy.add()numpy.subtract()numpy.multiply()numpy.divide()numpy.floor_divide(x1,x2)numpy.power()numpy.sqrt(x,*args,**kwargs)numpy.square(x,*args,**kwargs) 三角函数numpy.sin()numpy.cos()numpy.tan()numpy.arcsin()numpy.arccos()numpy.arctan() 指数和对数numpy.exp()numpy.log()numpy.exp2()numpy.log2()numpy.log10() 加法函数、乘法函数numpy.sumnumpy.cumsumnumpy.prod乘积numpy.cumprod累乘numpy.diff差值 四舍五入numpy.aroundnumpy.ceilnumpy.floor 杂项numpy.clipnumpy.absnumpy.sign 真值测试nump
关于数字雨特效的学习 数字雨特效在很多场景都得到应用,看起来非常具有科技感。因此,一次偶然的机会在CSDN中学习了如何制作特效雨,下面分享一下学习数字特效雨的收获,并在此基础上做了一些有趣的实验和创新(虽然效果不好hhh) 用到的库有:pygame/numpy/random 下面先看一下制作特效雨的流程图 在特效雨制作开始之前,先载入需要的函数库importpygame importnumpyasnp importrandom #构建显示框 FONT_PX=20 pygame.init() winSur=pygame.display.set_mode((800,1000))#构建显示框 font=pygame.font.SysFont('fangsong',20)#字体 bg_suface=pygame.Surface((800,1000),flags=pygame.SRCALPHA)#界面设置 pygame.Surface.convert(bg_suface) bg_suface.fill(pygame.Color(0,0,0,13))#颜色设置 winSur.
自动情感识别在人机交互过程和物联网技术设计中发挥着重要作用。然而,情感识别系统的一个普遍问题在于可靠标签的稀缺。通过对感兴趣的样本之间的成对差异进行建模,连体网络可以帮助缓解这一挑战,因为它比传统的深度学习方法需要更少的样本。在本文中,我们提出了一种距离损失,它可以应用在连体网络微调上,通过基于相同和差异类对之间的相关距离来优化模型。我们的系统使用源数据的样本来预训练所提出的连体神经网络的权重,并根据目标数据进行微调。我们提出了一个使用语音的情感识别任务,因为语音是最普遍和最经常使用的生物行为信号之一。我们的目标数据来自RAVDESS数据集,而CREMA-D和eNTERFACE'05分别被用作源数据。我们的结果表明,所提出的距离损失能够大大有利于连体网络的微调过程。同时,与冻结层数相比,源数据的选择对连体网络性能的影响更大。这些都表明,在传递学习领域,应用Siamese网络和建模对偶差异进行自动情感识别具有很大的潜力。原文题目:ASiameseNeuralNetworkwithModifiedDistanceLossForTransferLearninginSpeechEmo
基于FPGA单级CIC滤波器实现8倍抽取1概述在数字信号处理中,CIC滤波器是FIR滤波器中最优的一种,其使用了积分,梳状滤波器级联的方式。CIC滤波器由一对或多对积分-梳状滤波器组成,在抽取CIC中,输入信号依次经过积分,降采样,以及与积分环节数目相同的梳状滤波器。在内插CIC中,输入信号依次经过梳状滤波器,升采样,以及与梳状数目相同的积分环节。CIC滤波器的发明者是EugeneB.Hogenauer,这是一类使用在不同频率的数字信号处理中的滤波器,在内插和抽取中使用广泛。与大多数FIR滤波器不同的是,它有一个内插或者抽取的结构。1,线性相位响应2,仅需延迟,加减法便可实现,不需要乘法,在FPGA等平台上易于实现。2单级CIC滤波器CIC滤波器的冲击响应为:3设计目标 利用单级CIC滤波器将采样率为352.8KHZ的1khzsin波向下降采样率到44.1khz的1khzsin波(8倍抽取)。1,matlab设计验证2,FPGAverilog设计验证。4matlab设计验证%SingleCIC%352.8khzsampleratedownto44.1khzsamplerateclose
CSS:before和:after属性是被称为pseudo元素的。它们用于在元素的内容之前或之后添加内容。这些pseudo元素有很多用途,我们将在这里探索其中的一些用法。语法如果我们有这样的元素:<h2>welcometoourwebsite</h2>我们可以在使用CSS之前添加一个pseudo元素,比如:h2:before{复制content:“Hello“;color:blue;}结果将是:这是一个非常简单的原则。在某个元素之前或之后添加内容。在添加图标、清除浮动以及在许多其他情况下,它可能非常有用。pseudo元素的内容属性可以用空引号括起来:“”。这样,您就可以将pseudo元素当作一个没有内容的框。如果内容属性完全删除,pseudo元素将不起作用。添加图标在pseudo元素之前和之后最流行的用法可能是使用它们来添加图标。让我们看一下标记。HTML:<h2>Weatherreport</h2>复制CSS:h2:before{复制content:“”;复制display:block;复制height:15px;复制width:25p
#include<iostream> usingnamespacestd; chars1[105],s2[105]; intval[5][5]={ {5,-1,-2,-1,-3}, {-1,5,-3,-2,-4}, {-2,-3,5,-2,-2}, {-1,-2,-2,5,-1}, {-3,-4,-2,-1,-1000000}}; intdp[105][105];//dp[i][j]表示字符串i和j的最长公共子序列 intn,m; intmax(inta,intb) { returna>b?a:b; } intid(charc) { switch(c) { case'A': return0; break; case'C': return1; break; case'G': return2; break; case'T': return3; break; } } intfun() { inti,j; memset(dp,0,sizeof(dp)); for(i=1;i<
https://github.com/TheAlgorithms/Python;本文内容出自于此。 SortAlgorithms(排序算法) Bubble(冒泡) 维基百科:冒泡排序(英语:BubbleSort,台湾另外一种译名为:泡沫排序)是一种简单的排序算法。它重复地走访过要排序的序列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。 算法描述 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。 针对所有的元素重复以上的步骤,除了最后一个。 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 由于它的简洁,冒泡排序通常被用来对于程序设计入门的学生介绍算法的概念。 特性: 最差时间复杂度:O(n^2) 最好时间复杂度:O(n) 平均时间复杂度:O(n^2) Python代码实现: ViewCode 输出结果:fi
当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用! 方去引用可以看做是Lambda表达式深层次的表达。换句话说,方法引用就是Lambda表达式,也就是函数式接口的一个实例,通过方法的名字来指向一个方法,可以认为是Lambda表达式的一个语法糖。 要求:实现接口的抽象方法的参数列表和返回值类型,必须与方法引用的方法的参数列表和返回值类型保持一致! 格式:使用操作符“::”将类(或对象)与方法名分隔开来。 如下三种主要使用情况: 对象::实例方法名 类::静态方法名 类::实例方法名 Employee.java packagecom.klvchen.java2; publicclassEmployee{ privateintid; privateStringname; privateintage; privatedoublesalary; publicintgetId(){ returnid; } publicvoidsetId(intid){ this.id=id; } publicStringgetName(){ r
一. 预先安装 1. 安装PycharmIDE专业版(需要激活码,百度找找),不建议安装社区版 2. 安装npm,Vue官网建议安装v10以上的Node.js版本 二. 安装vue脚手架 #安装vue-cli npminstall-g@vue/cli #验证 vue--version复制 三.使用PyCharm创建Vue项目 打开PyCharm--File--NewProject--点击Vue.js图标复制 注意事项:如果新建项目时找不到Vue.js图标,请参考这里 四. 配置Vue项目启动项 查看package.json文件信息--点击AddConfiguration复制 点击+号--选择npm--输入serve复制 五. 启动Vue项目 点击运行按钮--通过浏览器访问http://localhost:8080/复制 预期效果如下图所示:
记第一次笔试,真实菜得扣jio! 第一题: 1#include<iostream> 2#include<cstdio> 3usingnamespacestd; 4intmain() 5{ 6intt; 7scanf("%d",&t); 8inta[100005],b[100005]; 9inti,j,n; 10while(t--){ 11scanf("%d",&n); 12intl=-1,r=-1; 13for(inti=0;i<n;i++){ 14scanf("%d",&a[i]); 15} 16for(inti=0;i<n;i++){ 17scanf("%d",&b[i]); 18if(b[i]!=a[i]){ 19if(l==-1){ 20l=i; 21} 22r=i; 23} 24} 25if(l==-1&&r==-1){ 26cout<<"YES"<<endl; 27continue; 28} 29intk=b[l]-a[l]; 30intflag=1; 31for(
之前在博文中为了更好的给大家演示APP的实现效果,本人了解学习了几种给手机录屏的方法,今天就给大家介绍两种我个人用的比较舒服的两种方法: (1)配置adb环境后,使用cmd命令将手机界面操作演示存为视频文件 (2)使用Google浏览器(GoogleChrome)提供的扩展程序Vysor将手机界面演示在电脑上(几乎没有延时) 下面我们具体介绍两种方法的使用步骤: 一、使用cmd命令录屏 (1)SDK下载 网上有各种SDK下载的方法,个人认为安装AndroidStudio后连接自己的手机,根据手机实际API来下载应对的SDK,具体方法大家这里不赘述喽。下面给出各个系统版本SDK对应的API: (2)先配置adb环境变量 具体方法参照http://jingyan.baidu.com/article/3aed632e0a50fb70108091ea.html (3)cmd命令录屏 完成前两步操作后,手机连接电脑后,win+R进入运行,输入cmd进入命令命令窗口: 我们演示将录制完的视频存入sdcard的根目录下,本来想直接存为.gif格式,验证无效,只可以先存为.mp4格式
一、什么叫重映射:就是把一幅图像中某位置的像素放置到另一个图片指定位置的过程。 二、映射原理: x轴:遍历原图x轴 取出每个像数元素,复制到 新图像x轴 y轴:遍历原图y轴 取出每个像数元素,复制到 新图像y轴 三、应用场景: -》放大: -》缩小 -》翻转 -》对调 四:函数说明: voidremap( InputArraysrc, // 输入图像,即原图像,需要单通道8位或者浮点类型的图像 OutputArraydst, // 输出图像,即目标图像,需和原图形一样的尺寸和类型 InputArraymap1, // 它有两种可能表示的对象:(1)表示点(x,y)的第一个映射;(2)表示CV_16SC2,CV_32FC1等 InputArraymap2, //
一堆废话 代码 B站视频讲解 首先暴力做法: 分别从两个点开始一层一层地向上跳,直到跳到一样的点,这个点就是他俩的LCA了。 这个做法实在太暴力了,不可取,不可取... 有一个不那么暴力的做法——倍增法。 预处理复杂度:O(nlogn) 询问复杂度:O(Qlogn) Q:询问组数 其(da)实(gai)就是一跳跳好几层。 设fa[i][j]记录从i点向上跳2j层所到达的点,fa数组是预处理得出的(还有每个点的深度deep也是),后面会说。 _____________先看LCA的求法____________________________________________ 对于两个点的位置有两种情况: ①位于同一层: 这时只要两个点一起跳,直到跳到相同的点即可。 for(inti=20;i>=0;i--){ if(fa[x][i]!=fa[y][i]){ x=fa[x][i]; y=fa[y][i]; } }复制 ②不同层: 将深度更深的点向上跳到与
<!--开始--><styletype="text/css">#msg_win{position:absolute;right:0px;display:none;overflow:hidden;z-index:99;border:1pxsolid#c00;background:#F9EFFC;width:210px;font-size:12px;margin:0px;}#msg_win.icos{position:absolute;top:2px;*top:0px;right:2px;z-index:9;}.icosa{float:left;color:#FFFFFF;margin:1px;text-align:center;font-weight:bold;width:14px;height:22px;line-height:22px;padding:1px;text-decoration:none;font-family:webdings;}.icosa:hover{color:#FFCC00;}#msg_title{background:#FA6705;b