MATLAB在进行数据处理的时候常常需要对于数据进行一系列运算的操作,本文主要介绍对于矩阵的算术运算、关系运算、逻辑运算、转置、求逆、累加或者累乘等操作。
目录
MATLAB中的算术运算主要包括点运算和矩阵运算,对于两个相同的矩阵进行点运算和矩阵运算的所得到的结果可能是截然不同的。
当两个矩阵之间进行加减运算的时候,矩阵中相同行和列的元素之间进行加减运算,其中两个矩阵的维度必须是相同的(如果两个矩阵的维度不相同话,那么程序会报错)。
两个维度相同的矩阵相加的公式可以写成如下的形式,假设A和B分别为:
相加之后的结果为:
在线性代数上,我们直到矩阵的加减运算满足交换律A+B=B+A和结合律(A+B)+C=A+(B+C),这些在MATLAB中同样适用。
例如:
A=[45,23,62;61,73,89;13,15,84];
B=[59,49,91;18,39,20;8,71,49];
C=A+B
D=A-B
运算结果如下所示:
C =
104 72 153
79 112 109
21 86 133
D =
-14 -26 -29
43 34 69
5 -56 35
矩阵之间的减法的原理和矩阵的加法相似,同时矩阵的减法可以看作是A-B=A+(-B)。
矩阵的乘法可以分为数和矩阵相乘和矩阵和矩阵的相乘。
在数与矩阵相乘的过程中,假设实数k与矩阵A相乘,最后的结果为kA,矩阵的每一个元素均乘以k倍。假设矩阵A为:
在乘上k倍之后结果为:
通过MATLAB代码实现如下所示:
A=[4,5,6;16,14,17;20,4,15];
B=4*A
运算结果如下所示:
B =
16 20 24
64 56 68
80 16 60
在矩阵与矩阵相乘的过程中,假设A是一个m×p的矩阵,B是一个p×n的矩阵,如果A与B相乘最终得到一个m×n的矩阵。假设C=A*B,那么C的第i行第j列的元素是A的第i行的元素与B的第j列对应的元素乘积之和。这里假设A和B都是2×2行的矩阵:
那么A和B相乘的结果为:
在这里为了简化描述运算过程仅仅写了两个2×2矩阵的运算,通过MATLAB代码可以对于维度更高的矩阵进行计算,例如:
A=[12,-5;6,7;1,4];
B=[15,9,10;8,11,2];
C=A*B
运算的结果如下所示:
C =
140 53 110
146 131 74
47 53 18
通过上面的结果可以看出,3×2的矩阵和2×3的矩阵相乘得到最终的结果为3×3的矩阵。在线性代数中,我们直到两个矩阵相乘满足的是结合律:(AB)C=A(BC),k(AB)=(kA)B,还有分配率:A(B+C)=AB+AC,其中k表示常数,A、B、C分别为矩阵。
在MATLAB中,矩阵除法可以分为左除(/)和右除(\),其中A\B相当于,而A/B相当于
,如果A是非奇异的方阵,那么左除和右除都可以实现。
例如:
A=[2,3,8;4,7,9;5,6,4];
B=[4,5,4;3,5,9;8,3,2];
C1=A/B
C2=A\B
运算的结果如下所示:
C1 =
-0.6087 1.1304 0.1304
0.8333 0.6667 -0.1667
1.3551 -0.1594 0.0072
C2 =
4.3019 0.6981 -3.0566
-2.4906 -0.5094 2.7170
0.3585 0.6415 0.2453
可以看出针对左除和右除,最终运算结果是不同的。
在进行矩阵运算中的乘法运算时,矩阵的n次方即为矩阵与自身进行相乘的运算,需要注意的是,矩阵必须是方阵。假设A是一个方阵,那么就可以推出:,
,...依次类推,例如:
A=[2,1,4;5,2,1;4,6,2];
B=A^2
C=A^3
运行的结果如下所示:
B =
25 28 17
24 15 24
46 28 26
C =
258 183 162
219 198 159
336 258 264
在MATLAB中,矩阵运算和点运算是不同的概念,矩阵的点运算是矩阵每一个元素与对应相同行和列的矩阵进行乘运算。
例如,将两个3×3的矩阵分别进行矩阵运算和点运算:
A=[2,4,7;3,1,4;5,2,6];
B=[2,1,4;5,2,1;4,6,2];
C=A.*B
D=A*B
E=A/B
F=A./B
运算结果如下所示:
C =
4 4 28
15 2 4
20 12 12
D =
52 52 26
27 29 21
44 45 34
E =
1.6154 -0.7692 0.6538
0.9744 0.2821 -0.0897
1.4103 0.4872 -0.0641
F =
1.0000 4.0000 1.7500
0.6000 0.5000 4.0000
1.2500 0.3333 3.0000
通过上面的运算结果可以看出,矩阵运算和点运算是不同的值。
其中需要注意的是:
在MATLAB中,如果两个矩阵A和B,在进行点运算的乘方运算时所得到的矩阵是C,那么C的第i行第j列的计算方式为:。
例如:
A=[2,4,5;3,2,2];
B=[2,3,1;4,6,2];
C=A.^B
运算后的结果如下所示:
C =
4 64 5
81 64 4
除了“.^”之外,MATLAB中还提供了power函数,效果与”.^“效果相同,例如再次使用上面的矩阵可以得到:
A=[2,4,5;3,2,2];
B=[2,3,1;4,6,2];
C=A.^B
D=power(A,B)
运行结果如下所示:
C =
4 64 5
81 64 4
D =
4 64 5
81 64 4
通过前后对比不难看出,两者的运算结果是相同。因此power函数与”.^“效果等效。
MATLAB中关系运算符包括“>”(大于)、“<”(小于)、“>=”(大于等于)、“<=”(小于等于)、“==”(等于)和“~=”(不等于)等。
例如:
A=[12,45,18;19,24,28];
B=[12,10,19;24,29,14];
C=A>B
D=A<B
E=A>=B
F=A<=B
G=A==B
H=A~=B
运行结果如下所示:
C =
2×3 logical 数组
0 1 0
0 0 1
D =
2×3 logical 数组
0 0 1
1 1 0
E =
2×3 logical 数组
1 1 0
0 0 1
F =
2×3 logical 数组
1 0 1
1 1 0
G =
2×3 logical 数组
1 0 0
0 0 0
H =
2×3 logical 数组
0 1 1
1 1 1
通过上面的结果可以看出,两个矩阵之间的对应运算分别进行了关系运算,当关系运算结果为真的时候,结果返回为1;当关系运算结果为假的时候,结果返回为0。
与大多数编程语言相同,MATLAB中也提供了逻辑运算,逻辑运算主要包括下面这些运算符"&"(与)、“|”(或)、"~"(非)、和xor(异或)几种运算符。
例如:
A=[1,0,1;0,1,1];
B=[1,1,1;0,0,0];
C=A|B
D=A&B
E=~A
F=xor(A,B)
运行的结果如下所示:
C =
2×3 logical 数组
1 1 1
0 1 1
D =
2×3 logical 数组
1 0 1
0 0 0
E =
2×3 logical 数组
0 1 0
1 0 0
F =
2×3 logical 数组
0 1 0
0 1 1
逻辑运算同时也可以用来验证结果的正确性,例如对于下面的矩阵A检验所有大于10且为偶数的元素:
A=[12,11,8;16,19,21];
C=(A>10)&(mod(A,2)==0)
运行结果如下所示:
C =
2×3 logical 数组
1 0 0
1 0 0
将矩阵A的每一行与相同序列的列进行交换后的矩阵称之为转置矩阵,在线型代数中,转置矩阵一般用来表示。
假设A原有矩阵为:
进行转置后的矩阵为:
MATLAB对于矩阵的转置的操作如下所示:
A=[3,4,7;4,3,1];
B=A.'
运算结果如下所示:
B =
3 4
4 3
7 1
在对于矩阵进行数据处理的时候,我们常常需要对其求进行逆操作,假设AB=BA=E(E为单位矩阵),那么B是A的逆矩阵,同时A也是B的逆矩阵,在MATLAB中提供了inv函数对于矩阵进行求逆操作。
在线型代数中,我们直到有下面的结论:,利用MATLAB进行验证可以得到:
A=[3,4,6,7;23,4,5,16;8,39,2,10;4,5,17,21];
B=inv(A)
C=inv(inv(A))
运算之后所得到的结果如下所示:
B =
0.3233 0.0295 -0.0208 -0.1203
0.0815 -0.0136 0.0222 -0.0274
0.8130 -0.0522 -0.0515 -0.2067
-0.7391 0.0399 0.0404 0.2444
C =
3.0000 4.0000 6.0000 7.0000
23.0000 4.0000 5.0000 16.0000
8.0000 39.0000 2.0000 10.0000
4.0000 5.0000 17.0000 21.0000
在线性代数中也有如下结论:,同时可以利用MATLAB进行验证和求解:
A=[13,4,5;17,23,10;8,5,7];
B=[5,9,11;14,18,20;31,34,33];
C=inv(A*B)
D=inv(B)*inv(A)
运行结果如下所示:
C =
-0.1511 0.0670 -0.0165
0.2673 -0.1576 0.1199
-0.1373 0.0981 -0.0992
D =
-0.1511 0.0670 -0.0165
0.2673 -0.1576 0.1199
-0.1373 0.0981 -0.0992
通过运行的结果可以看出结果相同,可以验证结论的正确性。
在线性代数中,如果矩阵A可逆且,则满足下面规律:
,通过MATLAB代码对其进行验证,假设
:
a=2;
A=[5,6,8;4,3,9;7,8,2]
B=inv(a*A)
C=a^(-1)*inv(A
运行结果如下所示:
B =
-0.3750 0.2955 0.1705
0.3125 -0.2614 -0.0739
0.0625 0.0114 -0.0511
C =
-0.3750 0.2955 0.1705
0.3125 -0.2614 -0.0739
0.0625 0.0114 -0.0511
可以看到结果相同,说明结论正确。
除了inv函数之外,还可以通过计算矩阵的-1次方得到该矩阵的逆矩阵。
当矩阵A不是方阵的时候,矩阵是没有逆矩阵的,但是MATLAB提供了pinv函数用于对于不是方针的矩阵和非满秩的方阵求伪逆操作,所谓伪逆就是MATLAB找到一个与A的转置相同行和列的矩阵满足下面这些条件:ABA=A,BAB=B,此时B就是A的伪逆。
例如:
A=[2,5,4;5,6,8];
B=pinv(A)
运算结果如下所示:
B =
-0.2494 0.1837
0.4376 -0.2041
-0.1723 0.1633
在MATLAB中可以对于矩阵的所有数据进行求和以及求积的运算,在进行数据处理的过程中方便运算,下面对于求和和求积分别进行介绍。
MATLAB中提供了sum函数用于对于数据进行求和运算,针对sum函数,有如下所示的运算规则(其中V表示向量,A表示矩阵):
例如对于一个向量进行求和运算:
V=[34,24,5,6,31,23,45,23];
B=sum(V)
运算结果如下所示:
B =
191
在比如对于一个矩阵进行求和运算:
A=[3,4,7,8;8,5,3,1;9,5,10,12];
B=sum(A)
C=sum(A,1)
D=sum(A,2)
E=sum(sum(A))
运算结果如下所示:
B =
20 14 20 21
C =
20 14 20 21
D =
22
17
36
E =
75
通过上面的结果可以看到,sum(A)与sum(A,1)返回是一个行向量,计算矩阵中每一列的和,sum(A,2)返回的是一个列向量,计算的是矩阵中每一行的和,而sum(sum(A))计算的是矩阵中所有元素的和。
MATLAB中提供了prod函数用于对于数据进行求积运算,针对prod函数,有如下所示的运算规则(其中V表示向量,A表示矩阵):
例如:
例如对于一个矩阵进行求积运算:
A=[3,4,7,8;8,5,3,1;9,5,10,12];
B=prod(A)
C=prod(A,1)
D=prod(A,2)
E=prod(prod(A))
运算结果如下所示:
B =
216 100 210 96
C =
216 100 210 96
D =
672
120
5400
E =
435456000
通过上面的结果可以看到,prod(A)与prod(A,1)返回是一个行向量,计算矩阵中每一列的乘积,prod(A,2)返回的是一个列向量,计算的是矩阵中每一行的积,而prod(prod(A))计算的是矩阵中所有元素的积。
请帮助我理解范围运算符...和..之间的区别,作为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)是
我的问题的一个例子是体育游戏。一场体育比赛有两支球队,一支主队和一支客队。我的事件记录模型如下:classTeam"Team"has_one:away_team,:class_name=>"Team"end我希望能够通过游戏访问一个团队,例如:Game.find(1).home_team但我收到一个单元化常量错误:Game::team。谁能告诉我我做错了什么?谢谢, 最佳答案 如果Gamehas_one:team那么Rails假设您的teams表有一个game_id列。不过,您想要的是games表有一个team_id列,在这种情况下
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。
MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO
📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年
我明白了: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
问题是:除了在“OperatorExpressions”?例如:1%!2 最佳答案 是的,可以创建自定义运算符,但有一些注意事项。Ruby本身并不直接支持它,但是superatorsgem做了一个巧妙的把戏,将运算符链接在一起。这允许您创建自己的运算符,但有一些限制:$geminstallsuperators19然后:require'superators19'classArraysuperator"%~"do|operand|"#{self}percent-tilde#{operand}"endendputs[1]%~[2]#Out
我想合并多个事件记录关系例如,apple_companies=Company.where("namelike?","%apple%")banana_companies=Company.where("namelike?","%banana%")我想结合这两个关系。不是合并,合并是apple_companies.merge(banana_companies)=>Company.where("namelike?andnamelike?","%apple%","%banana%")我要Company.where("名字像?还是名字像?","%apple%","%banana%")之后,我会写代
在Ruby中有运算符(operator)。在API中,他们没有命名它的名字,只是:Theclassmustdefinetheoperator...Comparableusestoimplementtheconventionalcomparison......theobjectsinthecollectionmustalsoimplementameaningfuloperator...它叫什么名字? 最佳答案 参见上面的@Tony。然而,它也被称为(俚语)“宇宙飞船运算符(operator)”。