在matlab中写入卷积函数给出了麻烦

时间:2010-08-19 20:20:24

标签: matlab convolution

嘿那里,我一直难以编写相当于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的答案。 我哪里出错?

另外,抱歉我在Opera mini上的格式化。

2 个答案:

答案 0 :(得分:3)

除了未定义x,并且您的变量x1x2bufferanswer全部为零之外,我不是确定你为什么要设置嵌套循环。我不知道为什么你需要以这种方式重现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));

答案 1 :(得分:0)

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

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

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

(当然conv也可以这么说 - 但我想你是重新实现作业还是理解它是如何运作的?)