matlab error函数_卷积与多项式-MATLAB指令引出的思考

引子

在MATLAB中,对于卷积与多项式的计算使用的一个指令:[1]

conv(p1,p2)

d4b8cc18b2fa1abe24774c6e4d0614bc.png
MATLAB里面的用法
创建包含多项式
的系数的向量
u = [1 0 1];
v = [2 7];
w = conv(u,v)
>>
w = 1×4

     2     7     2     7
两个向量 uv 的卷积,表示 v 滑过 u 时依据这些点确定的重叠部分的面积。从代数方法上讲,卷积是与将其系数为 uv 元素的多项式相乘相同的运算。 m = length(u)n = length(v)。则 w 是长度为 m+n-1 且第 k 个元素为

详情看官方文档.

多项式定义[2]

多项式(Polynomial)是代数学中的基础概念,是由称为 未知数的变量和称为 系数的常数通过有限次加减法、乘法以及自然数幂次的乘方运算得到的代数表达式。多项式是整式的一种。未知数只有一个的多项式称为一元多项式;例如
就是一个三项一元二次多项式。未知数不止一个的多项式称为多元多项式,例如
就是一个三项三元三次多项式,一个多项式就几次取决于最高的那个项的次数。(
属于二次)可以写成只由一项构成的多项式也称为
单项式。如果一项中不含未知数,则称之为 常数项

e131a0847142196964ad7aad7165ed5f.png
一元三次多项式的函数图像(三次项系数为正)

多项式的定义较为简单,下面来看看它的运算。

多项式运算

多项式

多项式

多项式的乘法

,就是下面的运算:

,这个运算是把同幂次的项目,结果为:

,即
,这个是说明,对于固定的幂次
而言,把这个幂次
无需拆分为两部分的和也就是最终的结果。上面的结果也可以写成下面的形式:

很有趣的一点是,多项式串起来是幂级数,在组合数学里面有一种特殊的幂级数称为形式幂级数,这些运算都是一致的。

卷积定义[3]

卷积是数学分析中一种重要的运算。设:
上的两个可积函数,作积分:

可以证明,关于几乎所有的
,上述积分是存在的。这样,随着

的不同取值,这个积分就定义了一个新函数
,称为函数
的卷积,记为
。我们可以轻易验证:
,并且
仍为可积函数。这就是说,把卷积代替乘法,
空间是一个代数,甚至是巴拿赫代数。虽然这里为了方便我们假设
,不过卷积只是运算符号,理论上并不需要对函数
有特别的限制,虽然常常要求
至少是可测函数(measurable function)(如果不是可测函数的话,积分可能根本没有意义),至于生成的卷积函数性质会在运算之后讨论。

卷积与傅里叶变换有着密切的关系。例如两函数的傅里叶变换的乘积等于它们卷积后的傅里叶变换,利用此一性质,能简化傅里叶分析中的许多问题。
由卷积得到的函数
一般要比
都光滑。特别当
为具有紧支集的光滑函数,
为局部可积时,它们的卷积
也是光滑函数。利用这一性质,对于任意的可积函数
,都可以简单地构造出一列逼近于
的光滑函数列
,这种方法称为函数的光滑化或正则化。卷积的概念还可以推广到数列、测度以及广义函数上去。

综上所述,也就是

这样的运算称为卷积,
卷积后的函数,

二者之间的关系

设多项式为

观察两个表达式:

其实二者之间的运算是一样的形式,积分代表了无限小的求和,在计算机中的运算,分隔的足够小就可以作为积分运算的结果了。所以对于二者,仅仅定义域不同,多项式的定义域是在整数域

,卷积运算则定义在实数域
,二者之间的算法是通用的。

算法

对于MATLAB的conv命令的用法,C=CONV(A,B,SHAPE)会返回二者卷积SHAPE大小的一段,SHAPE参数的取值如下:

full 全卷积(默认值)。

>> a=[0,1,2,3]
a =
     0     1     2     3
>> b = [3,2,1]
b =
     3     2     1
>> conv(a,b,'full')
ans =
     0     3     8    14     8     3
>> conv(a,b)
ans =
     0     3     8    14     8     3

same与A 大小相同的卷积的中心部分。

>> conv(a,b,'same')
ans =
     3     8    14     8

valid仅计算的没有补零边缘的卷积部分。使用此选项时,length(C) 是 max(length(A)-length(B)+1,0),但 length(B) 为零时除外。如果length(B) = 0,则 length(C) = length(A)。

>> conv(a,b,'valid')
ans =
     8    14

上面的话虽然是人话,但是过程不是很容易懂,下面来看看卷积的过程。

b4ced5ec60e70ad42b7841cea661352d.png
卷积过程

从这个卷积过程可以看出,卷积的步骤首先要固定一个B不动,即conv的第二个参数,将conv的第一个参数A先进行逆序翻转,之后一步一步的滑动,之前有在其他的书上看过褶积,滑积的翻译,不过忘了哪本书了。接着不断滑动的过程也就是得到结果的步骤,结果是各个同列的数据的对应的乘积和,即图中的黄色的部分。在MATLAB中的valid 参数也就是对于A来说,不需要补充0的部分,即对于B中的每一个数字,都有一个A中的数字与其匹配(在同一列)。这样从头滑到尾,很容易发现,滑动的次数也就是卷据的项数。

下面来看看MATLAB里面的关于conv的代码。

中间的那段注释的大致意思如下:CONV(Convolution and polynomial multiplication,卷积和多项式相乘)。C=CONV(A,B)会返回矢量A和B的乘积,结果向量的长度为MAX([LENGTH(A)+LENGTH(B)-1,LENGTH(A),LENGTH(B)])。如果A和B是多项式的系数,他们的卷积也就等于这两个多项式的乘积。

function c = conv(a, b, shape)
%CONV Convolution and polynomial multiplication.
%   C = CONV(A, B) convolves vectors A and B.  The resulting vector is
%   length MAX([LENGTH(A)+LENGTH(B)-1,LENGTH(A),LENGTH(B)]). If A and B are
%   vectors of polynomial coefficients, convolving them is equivalent to
%   multiplying the two polynomials.
%
%   C = CONV(A, B, SHAPE) returns a subsection of the convolution with size
%   specified by SHAPE:
%     'full'  - (default) returns the full convolution,
%     'same'  - returns the central part of the convolution
%               that is the same size as A.
%     'valid' - returns only those parts of the convolution 
%               that are computed without the zero-padded edges. 
%               LENGTH(C)is MAX(LENGTH(A)-MAX(0,LENGTH(B)-1),0).
%
%   Class support for inputs A,B: 
%      float: double, single
%
%   See also DECONV, CONV2, CONVN, FILTER, XCORR, CONVMTX.
%
%   Note: XCORR and CONVMTX are in the Signal Processing Toolbox.


%   Copyright 1984-2013 The MathWorks, Inc.

if ~isvector(a) || ~isvector(b)
  error(message('MATLAB:conv:AorBNotVector'));
end

if nargin < 3
    shape = 'full';
end

if ~ischar(shape) && ~(isstring(shape) && isscalar(shape))
  error(message('MATLAB:conv:unknownShapeParameter'));
end
if isstring(shape)
    shape = char(shape);
end

% compute as if both inputs are column vectors
c = conv2(a(:),b(:),shape);

% restore orientation
if shape(1) == 'f' || shape(1) == 'F'  %  shape 'full'
    if length(a) > length(b)
        if size(a,1) == 1 %row vector
            c = c.';
        end
    else
        if size(b,1) == 1 %row vector
            c = c.';
        end
    end
else
    if size(a,1) == 1 %row vector
        c = c.';
    end
end

分析

1-首先conv的参数应该是两个向量,不能是矩阵

if~isvector(a)||~isvector(b)
      error(message('MATLAB:conv:AorBNotVector'));
end 

如果输入是矩阵那么报错:(x为矩阵)

>> conv(a,x)
错误使用 conv (line 28)
A 和 B 必须为向量。

2.可以接受三个参数,当接受两个参数的时候,默认第三个参数为full ,并且

if nargin < 3
    shape = 'full';
end

if ~ischar(shape) && ~(isstring(shape) && isscalar(shape))
  error(message('MATLAB:conv:unknownShapeParameter'));
end
if isstring(shape)
    shape = char(shape);
end

3.MATLAB的conv2 函数是一个内置函数,意思也就是不提供源代码,是来返回两个矩阵的二维卷积。

%CONV2 Two dimensional convolution.
%   C = CONV2(A, B) performs the 2-D convolution of matrices A and B.
%   If [ma,na] = size(A), [mb,nb] = size(B), and [mc,nc] = size(C), then
%   mc = max([ma+mb-1,ma,mb]) and nc = max([na+nb-1,na,nb]).
%
%   C = CONV2(H1, H2, A) first convolves each column of A with the vector
%   H1 and then convolves each row of the result with the vector H2.  If
%   n1 = length(H1), n2 = length(H2), and [mc,nc] = size(C) then
%   mc = max([ma+n1-1,ma,n1]) and nc = max([na+n2-1,na,n2]).
%   CONV2(H1, H2, A) is equivalent to CONV2(H1(:)*H2(:).', A) up to
%   round-off.
%
%   C = CONV2(..., SHAPE) returns a subsection of the 2-D
%   convolution with size specified by SHAPE:
%     'full'  - (default) returns the full 2-D convolution,
%     'same'  - returns the central part of the convolution
%               that is the same size as A.
%     'valid' - returns only those parts of the convolution
%               that are computed without the zero-padded edges.
%               size(C) = max([ma-max(0,mb-1),na-max(0,nb-1)],0).
%
%   See also CONV, CONVN, FILTER2, XCORR2.
%
%   Note: XCORR2 is in the Signal Processing Toolbox.

%   Copyright 1984-2011 The MathWorks, Inc.
%   Built-in function.

分析MATLAB的源码是不行了。还需要再找找其他的计算卷积的代码。

参考

  1. ^命令用法-MATLAB https://ww2.mathworks.cn/help/matlab/ref/conv.html
  2. ^多项式定义-维基百科 https://zh.wikipedia.org/wiki/%E5%A4%9A%E9%A0%85%E5%BC%8F
  3. ^卷积-维基百科 https://zh.wikipedia.org/wiki/%E5%8D%B7%E7%A7%AF
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Matlab有两个常用的卷积函数,分别是conv2和filter2。这两个函数都可以实现两个信号的卷积操作。 对于conv2函数,它的用法是C=conv2(A,B,shape),其A是输入图像,B是卷积核。shape参数用来指定输出的大小和形状。当shape=full时,返回全部二维卷积结果;当shape=same时,返回与A同样大小的卷积心部分;当shape=valid时,不考虑边界补零,只返回有效的卷积结果。 conv2函数的实现步骤如下: 1. 将输入图像A进行边界补零,补零的行数为卷积核的行数减1,补零的列数为卷积核的列数减1。 2. 对卷积核进行旋转,使其心位置对齐。 3. 滑动卷积核,将卷积核的心位于图像矩阵的每一个元素。 4. 将旋转后的卷积核乘以对应的矩阵元素再求和,得到卷积结果。 另外一个卷积函数filter2,它的实现步骤与conv2类似: 1. 对输入图像进行边界补零,补零的行数为卷积核的行数减1,补零的列数为卷积核的列数减1。 2. 滑动相关核,将相关核的心位于图像矩阵的每一个元素。 3. 将相关核乘以对应的矩阵元素再求和,得到相关结果。 综上所述,Matlab卷积函数conv2和filter2都可以实现信号的卷积操作,它们的使用方法类似,但内部实现的细节有些许差异。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [matlab卷积函数](https://download.csdn.net/download/ohouchuang/5470181)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【matlab函数conv2、filter2、imfilter的区别](https://blog.csdn.net/horseinch/article/details/50545362)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值