【问题标题】:How can one find the parameters of N-fold convolution in Matlab?如何在 Matlab 中找到 N 倍卷积的参数?
【发布时间】:2019-10-08 12:41:15
【问题描述】:

我有一个有趣的问题是关于 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 个任意长度的任意向量,如何有效地计算上述向量?

【问题讨论】:

  • 如果我正确理解您的问题a0a1a2 是与v 长度相同的向量,对吗?但在这种情况下,您的所有方程系统都将是欠定的,因此将有无数个可能的a0a1a2。如果我误解了这个问题,请您添加一个特定案例的解决方案。
  • 另外我不明白你的句子let ''v'' be the convolution of v1,v2,v3,v4。卷积只能暗示两个函数(连续)或两个向量(离散)。那么v怎么可能是4个向量的卷积呢?
  • 是的,a0、a1、a2 是与 v 长度相同的向量。这里没有方程系统。我们正在逐个索引查找。因此,假设您将 [1, 1,1] 与 [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的乘数。现在清楚了吗?
  • v=conv(v1,v2); v=conv(v,v3);最后是 v=conv(v,v4);所以所有这 4 个相互卷积。
  • 好的,现在很清楚了,请随时在您的问题中添加此信息。只需一个参数,您就可以使用复数(使用p1 = 1i)。然后将实部和虚部分开就可以解决问题。

标签: matlab parameters convolution


【解决方案1】:

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)

【讨论】:

  • 我认为就计算复杂性而言,一维是更好的选择。或者?例如:vx=conv(v2,v3); vx=conv(vx,v4);然后 conv([ 0 0 4 5],vx) 将给出 a0,类似地 conv([ 1 0 0 0],vx) 和 conv([ 0 1 0 0],vx)。我仍然需要为下一个班次获取 v1_split 的向量。例如,当我有 v1=[3 p1 p2 5];然后我会有 v1_split = [0 1 0 0; 0 0 1 0; 3 0 0 5];?
  • 这完全取决于你的问题,当然你会节省一些操作,但如果你只有 10 个向量,你会失去上面代码的简单性,只节省几毫秒的时间。
  • 我明白了。实际上这个问题是一个玩具例子。通常我至少有 1000 个向量,每个向量的长度为 10。这意味着我总共将有 10.000 个班次。每次班次,我都会进行 1000 次 2D 卷积。这意味着我总共将有 1000 万个卷积。这只是我的大程序的一个迭代。我可能需要多达 100 次迭代才能收敛。我总共需要 10 亿个卷积。这仅适用于 1000 个向量。如果我有 100 万个向量,我不会得到任何结果。这种处理问题的方式似乎非常糟糕。这个解决方案是我的 2. 方法
  • 我想我错了。这可以非常有效地完成。首先,我们对所有 1000 个向量进行卷积。然后我们对内部具有参数的向量进行反卷积。之后,按照您在每次迭代的答案中所说的那样进行卷积。所以在一个向量内,每次移位只需要 1 个卷积。一个向量完成后,在我们进入下一个向量之前,我们需要用已经计算的 1000 个向量的整体卷积对该向量进行去卷积。使用这个向量,我们可以再进行 9 次迭代。因此,整个过程总共需要 10.000 个卷积。
  • 但是每次迭代时卷积向量的长度分别为 9001 和 10...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-19
  • 1970-01-01
  • 2020-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多