1

嘿,我一直难以编写该conv(x,y)函数的 matlab 等效项。我无法弄清楚为什么这会给出不正确的输出。对于数组 x1 = [1 2 1]x2 = [3 1 1].

这就是我所拥有的

x1 = [1 2 1];
x2 = [3 1 1];

x1len = leng(x1);
x2len = leng(x2);
len = x1len + x2len - 1;

x1 = zeros(1,len);
x2 = zeros(1,len);
buffer = zeros(1,len);
answer = zeros(1,len);

for n = 1:len
    buffer(n) = x(n);
    answer(n) = 0;

    for i = 1:len
        answer(n) = answer(n) + x(i) * buffer(i);
    end
end

matlab conv(x1,x2)给出3 7 6 3 1了输出,但这给了我3 5 6 6 6答案。我哪里出错了?

另外,对于我在歌剧迷你上的格式感到抱歉。

4

2 回答 2

3

除了没有x定义变量x1, x2,buffer和之外answer,我不确定为什么要像现在这样设置嵌套循环。我不知道为什么你需要以这种方式重现CONV的行为,但这是我设置嵌套 for 循环解决方案的方法:

X = [1 2 1];
Y = [3 1 1];

nX = length(X);
nY = length(Y);
nOutput = nX+nY-1;

output = zeros(1,nOutput);

for indexY = 1:nY
  for indexX = 1:nX
    indexOutput = indexY+indexX-1;
    output(indexOutput) = output(indexOutput) + X(indexX)*Y(indexY);
  end
end

但是,由于这MATLAB,因此存在以这种方式循环的矢量化替代方案。下面是一种这样的解决方案,它使用函数SUMSPDIAGSFLIPUD

output = sum(spdiags(flipud(X(:))*Y));
于 2010-08-19T21:37:32.470 回答
0

在给定的代码中,所有向量在开始之前都被清零,除了x从未定义过的向量。所以很难确切地看到你在做什么。但有几点需要注意:

  • 在您的内部for循环中,您正在使用buffer外部循环尚未设置的值。
  • 内部循环始终覆盖整个范围1:len,而不是相对于另一个向量移动一个向量。

您可能还想考虑“矢量化”其中的一些而不是嵌套for循环——例如,您的内部循环只是计算一个点积,已经存在一个非常好的 Matlab 函数。

(当然也可以这样说conv——但我猜你是在重新实现它作为家庭作业还是为了理解它是如何工作的?)

于 2010-08-19T21:19:56.317 回答