如何在Matlab中找到N折卷积的参数?

问题描述 投票:0回答:1

我有一个有趣的问题,它涉及K向量彼此的卷积。 K-1矢量的所有元素都是已知的。例如:

v1,v2,...vk,...,vK

并且除vk之外,所有向量的所有元素都是已知的,并且vk中只有两个相邻元素是参数。例如:

v1=[p1 p2 4 5];
v2=[1 4 2 3 2 1];
v3=[1 1 1 2];
v4=[2 2 1 3 4];

问题如下:

让“ v”是v1,v2,v3,v4的卷积,即(假设conv代表符号)

v=conv(v1,v2); 
v=conv(v,v3);
v=conv(v,v4);

然后,可以将v的每个元素编写如下:

v(n)=a0(n)+a1(n)*p1+a2(n)*p2

示例:让我们有两个向量

v1=[1, 1,1]
v2=[p1,p2,1]

然后

v=[p1,p1+p2,p1+p2+1,p2+1,1]

因此,我们有

a0=[0,0,1,1,1], a1=[1,1,1,0,0], a2=[0,1,1,1,0]

所以a0是v的每个元素的常数,a1是p1的乘数,而a2是p2的乘数

我想拥有一个可以计算a0(n),a1(n)和a2(n)的高效算法。在下一次迭代中,我将转移参数,但存在相同的问题。一班后,我将有

v1=[3 p1 p2 5];
v2=[1 4 2 3 2 1];
v3=[1 1 1 2];
v4=[2 2 1 3 4];

两班后:

v1=[3 1 p1 p2];
v2=[1 4 2 3 2 1];
v3=[1 1 2 2];
v4=[2 2 1 3 4];

三班后:

v1=[3 1 4 5];
v2=[p1 p2 2 3 2 1];
v3=[1 1 1 2];
v4=[2 2 1 3 4];

一直持续到

v1=[3 1 4 5];
v2=[1 4 2 3 2 1];
v3=[1 1 1 2];
v4=[2 2 1 p1 p2];

在每次迭代中,我需要获得a0(n),a1(n)和a2(n)。因此,总共有15次迭代,每次迭代我将获得3个向量。因此,我总共需要获得一个具有15行和3xlength(a0)列的矩阵。

 i=1 -> a0_i,a1_i,a2_i, for i=1,...,15.

我的想法是将所有向量的所有元素定义为参数p1,... pK。然后将它们全部象征性地卷积一次。这给出v(p1,...,pN)。然后在每次迭代中,除了感兴趣的两个相邻参数外,我都可以给出所有其他值,并且可以评估v,例如:

v(p1,p2,1,3 4,....,2)

此后,我可以检查v的每个元素是否为

v(n)= a0(n)+ a1(n)* p1 + a2(n)* p2

并提取a0(n),a1(n)和a2(n)。

首先,我不确定这是否有效。因为,在每次迭代中,我必须评估整个符号对象v(p1,p2,1,3 4,....,2),这可能是不必要的,因为我只有简单的参数迭代。其次,我不知道如何象征性地对K个向量进行卷积,或者这是一个好主意还是一个坏主意。

另一种想法是,除一个矢量外,所有矢量均不包含任何参数。因此,首先可以将这些向量与conv函数进行卷积并获得v *。那么,a1(n)和a2(n)似乎只是v *的元素,只有一个是彼此偏移的。这是我在纸上做的一个示例(p1,p2是参数,p3,p4是已知的,而a1,..,a13是已知向量的卷积的结果):

enter image description here

这种方法似乎更清晰,但是在每次迭代中,都必须对K-1个向量进行卷积。因此,似乎需要进行大量计算,并且可能有许多计算与先前的迭代相同。因此,在我看来似乎没有那么有效。

问题:给定K个任意长度的任意向量,如何有效地计算上述向量?

matlab parameters convolution
1个回答
0
投票

conv不支持符号数学。因此,我们必须使用另一种方法。

一种解决方案是将包含两个参数的向量分成三部分。

如果我们有v1 = [p1 p2 4 5]

我们可以创建v1_split

 v1_split = [1 0 0 0;   %p1
             0 1 0 0;   %p2
             0 0 4 5];  

然后如果可以递归使用conv2解决问题:

sol = conv2(conv2(conv2(v1,v2),v3),v4)

它将输出3xlength(a)向量,其中第一行是a0,第二行是a1,最后一行是a2。

© www.soinside.com 2019 - 2024. All rights reserved.