运算是算法的基础,所以我们有必要了解我们使用的工具怎样实现矩阵的基本运算。
这篇博文总结MATLAB中矩阵的算术运算符。
目录
A+B表示把矩阵A和B的对应元素相加,A和B必须是具有相同尺寸的矩阵,除非它们之一为标量。
此种情况的第一个示例如下(A、B皆为相同尺寸的矩阵):
A = [1 2 3;4 5 6;7 8 9];
B = [2 3 4;5 6 7;8 9 0];
C = A+B;
运行结果:



此种情况的第二个示例如下(A、B中一个为矩阵,一个为标量):
A = [1 2 3;4 5 6;7 8 9];
b = 5;
C = A+b;



A-B表示把矩阵A与矩阵B中的对应元素进行相减运算。A和B必须是具有相同尺寸的矩阵,除非它们之一为标量。运算符“-”还可以求矩阵中每个元素的相反数。
运算符“-”的第一个示例代码(A、B均为矩阵)
A = [1 2 3;4 5 6;7 8 9];
B = [2 3 4;5 6 7;8 9 0];
C = B-A;



运算符“-”的第二个示例代码(A、B中一个为矩阵,一个为标量)
A = [1 2 3;4 5 6;7 8 9];
b = 2;
C = b-A;
D = A-b;




运算符“-”的第三个示例代码(求矩阵中每一个元素的相反数)
A = [1 2 3;4 5 6;7 8 9];
B = -A;
运行结果如下:


功能:A.*B相当于矩阵A和矩阵B对应的元素相乘,A和B必须是具有相同尺寸的矩阵,除非它们之一为标量。
运算符“.*”的第一个示例代码:
A = [1 2 3;4 5 6;7 8 9];
B = [2 3 4;5 6 7;8 9 0];
C = A.*B;
运行结果:

运算符“.*”的第二个示例代码:
A = [1 2 3;4 5 6;7 8 9];
b = 3;
C = A.*b;
D = b.*A;
运行结果如下:


功能:运算符“./”是元素的右除法,A./B的意思为A矩阵中的元素除以B矩阵中的对应元素,A和B必须是具有相同尺寸的矩阵,除非它们之一为标量。
运算符“./”的第一个示例代码如下:
B = [1 2 3;4 5 6;7 8 9];
A = [3 7 12;22 30 42;57 72 90];
C = A./B;
运行结果如下:



从上面的运算结果我们可以看出,元素与元素之间做的除法是真除(即既保留了整数部分也保留了小数部分)
运算符“./”的第二个示例代码如下:
A = [3 7 12;22 30 42;57 72 90];
b = 3;
C = A./b;
运行结果如下:



运算符“.\”为元素的左除法,这个运算符和运算符“./”的使用方法相同,只不过是把被除数和除数的位置换一下,即A.\B的意思为B矩阵中的元素除以A矩阵中的对应元素,A和B必须是具有相同尺寸的矩阵,除非它们之一为标量。
示例略!
作用:运算符“.^”为矩阵中元素的乘方。A.^B的意思为A中的元素为底数,B中对应的元素为指数作乘方运算。同样A和B必须是具有相同尺寸的矩阵,除非它们之一为标量。
运算符“.^”的示例代码如下:
A = [1 2 3;4 5 6;7 8 9];
B = [9 8 7;6 5 4;3 2 1];
C = A.^B;
运行结果如下:



运算符“.'”和运算符“ ’ ”都用于求矩阵的转置,区别在于对复数矩阵的处理,前者在求复数矩阵的转置时,不对每个元素求其共轭复数,后者在求复数矩阵的转置时,会对每个元素求其共轭复数。
示例代码如下:
A = [1 2 3;4 5 6];
B = A.';
C = A';
D = [1+2i 3+4i 5+6i];
E = D.';
F = D';
运行结果如下:







作用:A*B表示矩阵A和矩阵B的乘法,当A和B均为矩阵时,根据矩阵乘法的运算规则,A的列数需要和B的行数相等。如果不想满足这个条件而使用这个运算符,除非它们之一为标量,此时有A*b=A.*b
示例代码如下:
A = [1 2 3;4 5 6];
B = [7 8;9 10;11 12];
C = A*B;
b = 3;
D = A*b;
F = A.*b;
运行结果如下:






运算符“/”和运算符“\”的作用是矩阵右除法矩阵左除法。我们知道矩阵其实是没有除法的定义的,在线性代数中与之相关的概念是矩阵的逆。
那么A\B和B/A分别代表什么呢?
不考虑结果精度的话:A\B相当于 inv(A)*B
不考虑结果精度的话:B/A相当于 B*inv(A)
这里要特别注意:A\B并不像元素除法那样等于B/A,规律是被斜线压在下方的那个矩阵作求逆运算。
示例和验证代码如下:
A = [1 2;3 4];
B = [5 6;7 8];
C = A\B;
E = inv(A)*B;
D = B/A;
F = B*inv(A);
运行结果如下:


可见C和E的结果是一样的,说明A\B相当于inv(A)*B


可见D和F的结果是一样的,说明B/A相当于 B*inv(A)
运算符“^”是矩阵的乘方运算,注意在式子A^B中,A和B是不能同时为矩阵,具体用法如下:
当A和B都是标量时,表示标量A的B次方。
当A为方阵,B为正整数时,表示矩阵A的B次乘积;
当A为方阵,B为负整数时,表示矩阵A的逆的B次乘积;
当B为非整数时,有如下表达式:

运算符“^”的示例代码就不贴了。
延伸阅读:
Python的Numpy库中各种矩阵基本运算的示例代码(加、减、乘、点乘、点除、乘方、转置等)
OpenCV中的MAT类矩阵的各种基本运算及示例代码(加、减、乘、点乘、点除、乘方、累加、转置等)
请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是
matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1
点向量坐标矩阵的几何意义介绍旋转矩阵的几何含义之前,先介绍一下点向量坐标矩阵的几何含义点:在一维空间下就是一个标量,如同一条直线上,以任意某一个位置为0点,以一定的尺度间隔为1,2,3...,相反方向为-1,-2,-3...;如此就形成了一维坐标系,这时候任何一个点都可以用一个数值表示,如点p1=5,即即从原点出发沿着x轴正方向移动5个尺度;点p2=-3,负方向移动3个尺度; 在一维坐标系上过原点做垂直于一维坐标系的直线,则形成了二维坐标系,此时描述一个点需要两个数值来表示点p3=(3,2),即从原点出发沿着x轴正方向移动3个尺度,在此基础上沿着y轴正方向移动两个尺度的位置就是点p3。
SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手
MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO
我明白了:x,(y,z)=1,*[2,3]x#=>1y#=>2z#=>nil我想知道为什么z的值为nil。 最佳答案 x,(y,z)=1,*[2,3]右侧的splat*是内联扩展的,所以它等同于:x,(y,z)=1,2,3左边带括号的列表被视为嵌套赋值,所以它等价于:x=1y,z=23被丢弃,而z被分配给nil。 关于ruby-带括号和splat运算符的并行赋值,我们在StackOverflow上找到一个类似的问题: https://stackoverflow
我经常将预配置的lambda插入可枚举的方法中,例如“map”、“select”等。但是“注入(inject)”的行为似乎有所不同。例如与mult4=lambda{|item|item*4}然后(5..10).map&mult4给我[20,24,28,32,36,40]但是,如果我制作一个2参数lambda用于像这样的注入(inject),multL=lambda{|product,n|product*n}我想说(5..10).inject(2)&multL因为“inject”有一个可选的单个初始值参数,但这给了我......irb(main):027:0>(5..10).inject
问题是:除了在“OperatorExpressions”?例如:1%!2 最佳答案 是的,可以创建自定义运算符,但有一些注意事项。Ruby本身并不直接支持它,但是superatorsgem做了一个巧妙的把戏,将运算符链接在一起。这允许您创建自己的运算符,但有一些限制:$geminstallsuperators19然后:require'superators19'classArraysuperator"%~"do|operand|"#{self}percent-tilde#{operand}"endendputs[1]%~[2]#Out
我正在使用准备一个巨大的字符串循环中的运算符。最后我想删除最后2个字符。some_loopstr我认为上面的最后一个操作也会消耗内存和时间,但我不确定。就是想看看有没有和效果相反的操作所以我可以从同一个字符串中删除最后两个字符。 最佳答案 事实上,字符串切片已经是一种快速且内存高效的操作,因为只有在真正需要时才会复制字符串内容。请参阅“Seeingdouble:howRubysharesstringvalues”中的详细说明。请注意,这是对字符串操作的某种经典优化;Youhaveitinjavatoo我们经常在C中使用类似的技巧。所
在Ruby中有运算符(operator)。在API中,他们没有命名它的名字,只是:Theclassmustdefinetheoperator...Comparableusestoimplementtheconventionalcomparison......theobjectsinthecollectionmustalsoimplementameaningfuloperator...它叫什么名字? 最佳答案 参见上面的@Tony。然而,它也被称为(俚语)“宇宙飞船运算符(operator)”。