我有一个有趣的问题,它涉及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是已知向量的卷积的结果):
这种方法似乎更清晰,但是在每次迭代中,都必须对K-1个向量进行卷积。因此,似乎需要进行大量计算,并且可能有许多计算与先前的迭代相同。因此,在我看来似乎没有那么有效。
问题:给定K个任意长度的任意向量,如何有效地计算上述向量?
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。