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

How can one find the parameters of N-fold convolution in Matlab?

我有一个有趣的问题,它是关于 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

Example: Lets have two vectors

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.

My idea was to define all elements of all vectors as parameters p1,...pK. Then convolve all of them just one time symbolically. This gives v(p1,...,pN). Then at each iteration, except for the two neighboring parameters of interest, I can give all other values and I can evaluate v for example:

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

after this, I can check every element of v for

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

and extract a0(n), a1(n) and a2(n).

First of all I am not sure whether this is efficient or not. Because, at each iteration I must evaluate the whole symbolic thing v(p1,p2,1,3 4,....,2), which may be unnecessary since I have just simple iteration of the parameters. Second I dont know how one could do convolution of K vectors symbolically, or wheter it is a good or a bad idea.

另一种思路是看到除了一个vector之外,所有的vector都不包含任何参数。所以可以先用conv函数对这些向量进行卷积得到v*。然后,a1(n) 和 a2(n) 似乎只是 v* 的元素,只是一个是另一个的移位。这里以我在一篇论文中做的为例(p1,p2为参数,p3,p4已知,a1,..,a13为已知向量卷积的结果):

这种方法看起来更清晰,但在每次迭代中,必须对 K-1 个向量进行卷积。因此,似乎需要进行大量计算,并且可能许多计算与上一次迭代相同。因此,在我看来效率不高。

Question: Given K arbitarty vectors, each having arbitrary lengths, how can one calculate the above mentioned vectors efficiently?

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_split,v2),v3),v4)

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

当然我们可以使用递归函数代替conv2(conv2(conv2(...

function r = rconv2(x)
   if length(x) == 1 
      r = x{1};
   else
     r = conv2(x{1},rconv2(x(2:end)));
   end
 end

所以现在我们可以使用类似的东西:

%input vector for step 1
v ={[1 0 0 0; 0 1 0 0; 0 0 4 5],[1 4 2 3 2 1],[1 1 1 2],[2 2 1 3 4]} %{v1_split,v2,v3,v4}

%recursive convolution
sol = rconv2(v)

编辑,根据@Seyhmus 评论改进:

%Initial cell array of vectors
v ={[1 3 4 5],[1 4 2 3 2 1],[1 1 1 2],[2 2 1 3 4]} %{v1,v2,v3,v4}

%recursive convolution (need to be run only once)
allconv = rconv2(v)

%Example for step 1
%Deconv allconv with v{1}
dec = deconv(allconv,v{1})

%Compute v1_split
...

%Getting the solution using 2D convolution with v1_split:
sol = conv2(dec,v1_split)