Matalb符号矩阵输入BUG

来源:互联网 发布:mac mysql忘记root密码 编辑:程序博客网 时间:2024/05/30 05:28

最近有位童鞋问笔者下面两段Matlab代码执行结果为啥不一样

代码1

x=sym('[0 1;-1 0]')y=sym('[1 -1;-2 1]')x*y
代码2

syms x ysubs(x*y,{x,y},{[0 1;-1 0],[1 -1;-2 1]})

代码1执行结果

x = [  0, 1][ -1, 0]  y = [  0, 0][ -2, 1]  ans = [ -2, 1][  0, 0]

代码2执行结果

ans =     0    -1     2     0
笔者的解释是第一个是符号矩阵的乘法,符合高等数学高等代数中的矩阵乘法运算,第二个是属于数组运算,即矩阵对应位置做乘法

但是问题了来了,第一个真的是矩阵乘法的结果吗,笔者又写了一个代码来验证

代码3

A=[0 1;-1 0]B=[1 -1;-2 1]A*BA.*B
代码3执行结果

A =     0     1    -1     0B =     1    -1    -2     1ans =    -2     1    -1     1ans =     0    -1     2     0
仔细一看,符号矩阵运算的结果与实际不符,再仔细查查,可以看到代码1中的矩阵存储的时候居然变化了。。。。

经过测试,符号矩阵转换的时候优先识别成表达式了,不足的列自动补0,列数与最后一行的列数有关,为了不使符号函数误解成表达式,应尽量避免用空格分割行元素,建议采用逗号分割

下面的代码是做测试的

代码4

syms a11 a12 a13 a21 a22 a23x=sym('[1 -a12;-2 1]')y=sym('[1 -a12;-2 -a22]')z=sym('[1 -a12 -a13;-2 -a22 -a23]')z2=sym('[1 -a12 -a13;-2 -a22 a23]')z3=sym('[1 -a12 -a13;-2 a22 a23]')z4=sym('[1 -a12 a13;-2 a22 a23]')sym('[1 -3;-2 -6]')
代码4执行结果
x = [ 1 - a12, 0][      -2, 1]  y =    1 - a12 - a22 - 2  z =    1 - a13 - a12 - a22 - a23 - 2  z2 = [ 1 - a13 - a12,   0][     - a22 - 2, a23]  z3 = [ 1 - a13 - a12,   0,   0][            -2, a22, a23]  z4 = [ 1 - a12, a13,   0][      -2, a22, a23]  ans =  -2 -8
下面代码将代码1中的空格改成逗号,就能得到正确的结果了

代码5

x=sym('[0,1;-1,0]')y=sym('[1,-1;-2,1]')x*y
代码5执行结果

x = [  0, 1][ -1, 0]  y = [  1, -1][ -2,  1]  ans = [ -2, 1][ -1, 1]
由于数值矩阵的空格在matlab中不会引起误解,所以也可以先定义数值矩阵,然后转成符号矩阵

代码6

A=[0 1;-1 0]B=[1 -1;-2 1]x=sym(A)y=sym(B)x*y
代码6执行结果

A =     0     1    -1     0B =     1    -1    -2     1 x = [  0, 1][ -1, 0]  y = [  1, -1][ -2,  1]  ans = [ -2, 1][ -1, 1]



0 0
原创粉丝点击