1

こんにちは、関数に相当する matlab を書くのに苦労していconv(x,y)ます。これが間違った出力を与える理由がわかりません。配列 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 で書式設定を行って申し訳ありません。

4

2 に答える 2

3

定義されていないことと、変数、、、xおよび がすべてゼロであることを除けば、入れ子になったループがそのように設定されている理由がわかりません。このようにCONVの動作を再現する必要がある理由はわかりませんが、ネストされた for ループ ソリューションをセットアップする方法は次のとおりです。x1x2bufferanswer

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 であるため、この方法でループする代わりにベクトル化された方法があります。そのような解決策の 1 つが次のとおりです。関数SUMSPDIAGS、およびFLIPUDを使用します。

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 に答える