Matalb符号矩阵输入BUG

原创 2015年07月08日 22:35:56

最近有位童鞋问笔者下面两段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]



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Ubuntu 下 stat 获取符号链接文件有 bug

今天根据stat这个函数写了ls -l的功能,测试时发现符号链接文件 l 不能被正确识别。 我创建了一个符号链接文件 10,指向普通文件1.c stat 这个函数无法获取符号链接文件的属性,他...

C++实现堆排序并记录编程中遇到的一个bug(不要对无符号整形数在--的循环中采用>=0作为结束条件)

通过二叉堆的堆序性质,就能通过堆进行排序。对于大顶堆,其树根为整个堆的最大值,对于小顶堆,其树根为整个堆的对小值。因此通过不断的获得堆顶,然后把堆最后一个元素放在堆顶,并重新维持堆序,反复如此,则获得...
  • cjbct
  • cjbct
  • 2017-01-09 20:05
  • 278

Hessian矩阵判定极值之MATLAB实现符号解

By WC 1.9 .2015 1.Hessian矩阵 其定义如下: 如果函数f在D区域内二阶连续可导,那么黑塞矩阵H(f) 在 D 内为对称矩阵。原因是:如果函数f连续,则二阶偏导数的求...

【数模学习】Matlab 符号微积分 计算微分、雅可比矩阵、不定积分与定积分、求解微分方程

1.计算微分      函数diff可以用来计算符号表达式的微分,其调用格式如下:      df=diff(f,n);      参数说明:df是微分运算的结果。f是输入的表达式,n是求导的次数,其...

矩阵快速幂+符号重载。

这本应该是昨天写的
  • modiz
  • modiz
  • 2014-07-11 11:26
  • 632

Unity 3D 海水的实现3 水反射BUG排除 反射矩阵的研究

版本:unity 5.4.1  语言:C#   上一节中实现了折射和反射,一下子水的效果就出来了,看起来非常棒,不过有个BUG不知道大家有没有发现。   直接来看两张图感受一下吧: ...

矩阵按键原理和BUG

当我们的电路有很多按键时,一般会采用矩阵方式与单片机相连来减少对单片机IO的浪费,如下图方式。 这个电路的原理: 1、比如检测S13是否按下,单片机把Line4设为输出,并输出低电平,而L...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)