嘿那里,我一直难以编写相当于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上的格式化。
答案 0 :(得分: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,因此可以通过这种方式进行循环的矢量化替代方案。下面是一个这样的解决方案,它使用函数SUM,SPDIAGS和FLIPUD:
output = sum(spdiags(flipud(X(:))*Y));
答案 1 :(得分:0)
在给定的代码中,除了从未定义的x
之外,所有向量在开始之前都被清零。所以很难确切地看到你所得到的东西。但有几点需要注意:
for
循环中,您使用的值buffer
尚未由外循环设置。1:len
,而不是相对于另一个移动一个向量。您可能还想考虑“向量化”其中一些而不是嵌套for
循环 - 例如,您的内部循环只是计算一个点积,为此已经存在一个非常好的Matlab函数。 / p>
(当然conv
也可以这么说 - 但我想你是重新实现作业还是理解它是如何运作的?)