【问题标题】:Convolution of two symbolic arrays on MatlabMatlab上两个符号数组的卷积
【发布时间】:2021-08-12 13:32:59
【问题描述】:

我有两个数组:

p1=[sym(1) sym(2)]
p2=[sym(3) sym(4)]

我想使用conv 函数对这两个列表进行卷积。

Matlab 输出如下:

使用 conv2 时出错

无效的数据类型。第一个和第二个参数必须是数字或逻辑。

转换错误(第 43 行)

c = conv2(a(:),b(:),shape);

谁能帮我解决这个问题?

【问题讨论】:

  • 您可以使用简单的for 循环自己进行乘法运算。翻转其中一个数组,然后将每个元素与其他元素相乘。此外,您提到conv(),但错误使用conv2()
  • @Adriaan 我想对非常大的数组进行卷积。这只是一个例证。所以for循环不是一个好的解决方案。是的我不知道为什么错误包含conv2
  • for 循环如何不是非常大的数组的好解决方案?据我所知,conv 无论如何都包含循环。

标签: matlab convolution symbolic-math


【解决方案1】:

编辑 1:我没有符号数学工具箱,所以我演示了对数值进行矩阵运算来计算转换,我认为这也应该对符号值起作用。

conv 函数只接受数值。 有一种方法可以按矩阵计算 conv 我用一个例子来演示它: 假设 u 和 v 如下:

u =
     1     2     1     3
v =
     2     7     1

>> conv(u,v)
ans =
     2    11    17    15    22     3

相反,我们可以先计算 u'*v,然后进行一些重新排列和求和以计算 conv: 所以首先:

>> c=u'*v
c=
     2     7     1
     4    14     2
     2     7     1
     6    21     3

然后我们进行一些重新排列:

>> d=[c;zeros(3,3)]
d =
     2     7     1
     4    14     2
     2     7     1
     6    21     3
     0     0     0
     0     0     0
     0     0     0
>>e= reshape(d(1:end-3),[6,3])
e=  
     2     0     0
     4     7     0
     2    14     1
     6     7     2
     0    21     1
     0     0     3

最后将值相加:

>> sum(e,2)
ans =
     2
    11
    17
    15
    22
     3

您可以编写自己的代码以使用“v size”来执行此操作(将 (numel(v)*numel(v)) 零添加到 u'*v 的末尾等等。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-07
    • 1970-01-01
    • 2014-03-08
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 2012-12-27
    • 2021-08-11
    相关资源
    最近更新 更多