关闭

Matalb符号矩阵输入BUG

标签: matlab符号矩阵
335人阅读 评论(0) 收藏 举报
分类:

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

代码1

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

syms x y
subs(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*B
A.*B
代码3执行结果

A =

     0     1
    -1     0


B =

     1    -1
    -2     1


ans =

    -2     1
    -1     1


ans =

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

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

下面的代码是做测试的

代码4

syms a11 a12 a13 a21 a22 a23
x=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     0


B =

     1    -1
    -2     1

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



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:681829次
    • 积分:9515
    • 等级:
    • 排名:第1878名
    • 原创:352篇
    • 转载:1篇
    • 译文:1篇
    • 评论:106条
    最新评论
    微信打赏
    微信
    支付宝打赏
    微信