2010-08-19 4 views
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을주고있는 것입니다. 어디서 잘못 됐습니까?

또한 미안 해요. 오페라 미니를 사용하고 있습니다.

답변

3

x 정의하고, 모든 제로를 가지고 있지 않는 변수 x1, x2, bufferanswer과 같이 중첩 루프를 설정 한 이유가 확실하지 않습니다. 난 당신이 CONV의 동작이 방법을 재현해야하는 이유를 알고 있지만, 여기에 내가 중첩에 대한 루프 솔루션을 설정 할 방법은 없습니다 :이 MATLAB이기 때문에,이 벡터화되어, 그러나

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 

을 이런 식으로 반복하는 대안.

output = sum(spdiags(flipud(X(:))*Y)); 
+1

출력 할 수 = SUM (spdiags (flipud (X (:)) * Y)) 하나 개의 이러한 솔루션은 기능 SUM, SPDIAGSFLIPUD를 사용하는 다음이고; 2D 컨볼 루션을 위해 확장 될 수 있는가? – user1816546

0

주어진 코드에서 x이 정의되지 않은 것을 제외하고는 모든 벡터가 시작되기 전에 0으로 출력됩니다. 따라서 당신이 무엇을 얻고 있는지 정확히 알기는 어렵습니다. 그러나 몇 가지 참고 사항 :

  • 를 내면 for 루프에서는 아직 외부 루프가 설정되지 않은 buffer의 값을 사용하고 있습니다.
  • 내부 루프는 하나의 벡터를 다른 벡터로 이동하는 대신 항상 1:len의 전체 범위를 포함합니다. 예를 들어, 귀하의 내부 루프 그냥 완벽하게 좋은 matlab에 기능이 이미 존재하는 내적을 계산하는 -

은 또한 오히려 for 루프를 중첩보다 이것 좀 "벡터화"에 대해 생각 할 수 있습니다.

(물론 동일 conv라고 할 수 있습니다 -하지만 난 당신이 숙제 또는 어떻게 작동하는지 이해하기 중 하나를 재 구현하고 추측)을 제외하고