如何用Mathmatica求矩阵外积?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用Mathmatica求矩阵外积?相关的知识,希望对你有一定的参考价值。
刚刚学Mathmatica,用Mathmatica求矩阵外积时
用的是MatrixForm[Outer[Times, a, b]]
结果变成了大矩阵里还有小矩阵,请问高手们如何把里面的小矩阵的括号去掉啊?万分感谢
有满意回答者,再奖50分,多谢
教材给出的程序中,有的语句后加了分号,有的没有加,分号的作用究竟是什么?在scilab中,分号的作用有两个:一是禁止输出变量的值;二是在括号内作为矩阵中一行的分隔符。明白了这一点,就能够理解在下列程序中加不加分号的异同了。
s=0
for i=1:1:1000
s=s+i;
end
此程序最终的执行结果是
s=
0.
原因就是由于在语句s=s+i;中有分号,禁止了s值的输出。如果去掉了分号,则输出结果就不一样了。当然,对于这道题,为了看到最终结果,建议在执行完成后输入s,以显示s的值。或者在源程序的最后添加输出语句:print(%io(2),s);或s都可以显示出最后的结果。
3x-y=13
x+y=-1
对于分号的第二个作用,在课本中出现的不多,主要是利用高斯算法求解方程组的问题时使用过。
比如求解方程组
需要设计的程序如下:
a=[1,1;3,-1]; ---------;作为系数的分隔符。
b=[-1;13];
linsolve(a,-b)
执行后输出:
ans =
3.
-4.
2.逗号
学过c语言的知道逗号在c语言里面是作为一个运算符使用的,在很多情况下,往往作为多条表达式的分隔符,以起到求解多条表达式的作用。在scilab中,逗号的作用和c语言中的功能类似,起分割scilab指令的作用。
例如在求解立方和不大于1000的程序内,就可以使用逗号分割两条指令。
i=1;
while i*i*i<1000
i,i=i+1; ------------------逗号分割两条指令,显示第一个i的值,而不显示i=i+1的值。
end
而在另一个程序里,求立方和不超过1000的最大值。有的人将程序编写如下:
i=1;
while i*i*i<1000, i=i+1; end
i=i-1;
i
在此程序内,逗号的作用依然是作为指令分隔符。只是使用逗号将循环体放在了判断的条件内,因此在该程序中,没有循环体,或者说循环体为空语句。它相当于下列程序:
i=1; -----------------------循环控制变量赋初值
while i*i*i<1000 ――――――――――循环条件
i=i+1; ――――――――――循环体。循环体中必须有改变循环控制变量的值的语句,
end ―――――――――――并且能够使循环趋向于结束。
i=i-1;
i
通过这一道例题,大家也可以看到while语句的三个要素。
另外,逗号用在函数内部可以用作参数分隔符。
二、三个重点函数解析
1. sqrt函数
此函数的功能是求解一个数的平方根的,它的英文全称为square root,意为平方根。它的参数只有一个。调用方式为y=sqrt(x),这里需要注意只要是函数,函数名后面必然有(),这是函数的标志,不能省略。引用此函数时,参数必须是正值,否则会引起程序错误。如果需要求一个以上的数的平方根,可以使用下列形式:
sqrt([2,4])
输出结果为:
ans =
1.4142136 2
教材中使用此函数求三角形的面积,实际授课时,可以求一个直角三角形的斜边或直角边。
2. linsolve函数
2y+3x-5=0
6x+12y=11
2y+3x=5
7x-y=18
英文全称为linear equation solver,用于线性方程求解。它的功能是求解所有适合Ax+B=0的线性方程解。在编写程序时需要注意x,y,z的系数需要对应起来,如果源方程为Ax=B的形式,则代换时必须使用-B。(具体解法为高斯解法,教材中有详细介绍,这里从略)此函数常常用来求方程组的解。只要注意出-即可。在授课时,教师可以补充两道练习,看学生是否真正掌握此函数。
调用此函数之后,如果语句后没有加分号,程序会自动的输出
ans =
一行。给出方程的根。
3.print
调用方式:
print(‘文件名’,x1[,x2,x3…,xn])
功能描述:
用默认的格式将文件内的所有指定变量输出,例如,scilab自定义的输出格式,所有类型的变量都可以输出。
注意:xi必须都是已经定义的变量,表达式中变量的值不能显示。
print(%io(2),…)的含义是将内容输出到显示器上,使用此语句可以显示任意个变量的值。
与此功能相同的一个函数是disp,它只能显示字符串的值,功能是显示其参数中的字符串。
如:disp(“not found”);则显示not found。
三、赋值语句
教材中给出了使用赋值语句的四点注意事项,却没有给出为什么这样规定的原因。这直接导致了学生只能通过死记硬背来解决这一难点。教参上用存储地址与存储空间来解释这一问题,部分数学教师依然看不懂。这里给出笔者的一点看法。
计算机中所有的变量都是存放在内存中的,内存就像一座座的小房子,有自己的地址编号,就像宾馆内的房间号码一样。当运行诸如a=3的语句时,实际上在程序执行之前,为变量a分配一定的存储空间,执行时,根据a的地址编号找到a的存储空间,将其置为3(二进制)。这样当解释a=a+1;时就容易了。同时3=a为什么不对的问题也容易解决了,因为数值3不是在内存中,它的存在是瞬间的,没有存放的内存空间,故所有的赋值语句的左侧只能是单个变量,而不能是常量。
四、教学建议
讲解此部分的内容时,教师应避免将精力放在具体的程序设计上,而应渗透算法的思想和计算机解决问题的特点,特别是三种基本逻辑结构上。学过程序设计语言的人都知道,要想在短时间内学会一门具体的语言是困难的,但如果先掌握算法的内涵,则在学习一门计算机语言时就能够变得轻松,因为大多数程序设计语言都是由三种基本结构构成的(比如c语言)。因此,在备课时,教师应在如何引导学生深入理解计算机如何工作及三种基本逻辑结构上下功夫,并同时利用scilab软件进行上机练习,从而加深学生对这两方面的认识。
算法初步是适应新时代的发展而新增的一章,需要引起数学教师的重视,为学生将来学习计算机编程打好基础。同时,应注意语言的准确与科学性,比如任何语言都提供了输入输出语句这句话就不对,因为我们熟知的c语言就没有输入输出语句,而是采用输入输出函数实现输入输出的功能。因此这句话应改为任何程序设计语言都提供了输入输出的功能。教师在授课时必须注意语言的准确性,避免给学生造成一些错误观念,同时尽可能利用相关的术语,让学生了解计算机语言并乐于使用计算机语言。
参考资料:http://www.ygblog.com/user1/3020/archives/2006/11449.html 参考技术A 矩阵的外积运算与矩阵的Dot运算一样,可有矩阵之间,矩阵与向量之间外积运算,Mathematica用Outer命令执行外积运算,
你用的命令"MatrixForm[Outer[Times, a, b]]
",是想将外积的结果表示成矩阵结构,这是不允许的,因为矩阵外积的结果不是一个矩阵,而是一个张量.
如何用matlab写矩阵的倒置?
参考技术A A.\'转置\\x0d\\x0aA\'共轭转置\\x0d\\x0ainv(A)逆\\x0d\\x0afilplr(A)左右翻转\\x0d\\x0aflipud(A)上下翻转\\x0d\\x0arot90(A)逆时针转90度\\x0d\\x0arot90(A,2)转180度\\x0d\\x0arot90(A,-1)顺时针转90度以上是关于如何用Mathmatica求矩阵外积?的主要内容,如果未能解决你的问题,请参考以下文章
R语言矩阵向量操作(矩阵乘法,向量内积外积(叉乘),矩阵转置,矩阵的逆)