-4

2 つの配列の値を (入力として) 乗算して出力を得る方法を回避しようとしています。私が抱えている問題は、以下に示すタスクを達成するためにループをインクリメントする方法です

#include <iostream>

using namespace std;

main()
{
 int* filter1, *signal, fsize1 = 0, fsize2 = 0, i = 0;

 cout << " enter size of filter and signal" << endl;
 cin >> fsize1 >> fsize2;

filter1 = new int [fsize1];
signal = new int [fsize2];

cout << " enter filter  values" << endl;
for (i = 0; i < fsize1; i++)
cin >> filter1[i];
 cout << " enter  signal values" << endl;
for (i = 0; i < fsize2; i++)
cin >> signal[i];

/*

2 つの配列はユーザ​​ーが入力する必要がありますが、テストには以下の配列を使用します。

int array1[6] = {2, 4, 6, 7, 8, 9};
int array2[3] = {1, 2, 3};

The output array should be

array3[8]= {1 * 2, (1 * 4 + 2 * 2), (1 * 6 + 2 * 4 + 3 * 2), (1 * 7 + 2 * 6 + 3 * 4), (1 * 8 + 2 * 7 + 3 * 6), (1 * 9 + 2 * 8 + 3 * 7), (2 * 9 + 3 * 8), 3 * 9}


*/


 return 0;
 }

これは、サンプリングされた信号のフィルターに関するより大きなタスクの一部ですが、私がやり遂げることができないのはこの乗算です。

4

4 に答える 4

1

畳み込みについては、こちらをご覧ください。

プロセスを理解すれば、コーディングはそれほど難しくありません。この Web サイトには、2 次元畳み込み用の C++ アルゴリズムも含まれています。

于 2012-12-03T23:22:19.727 に答える
0

私は 7 年間、たたみ込みについて一言も読んだことがありません。次のコード(テスト値で機能する)は、完全に例に基づいています。必要なアルゴリズムを正式な方法で明示していないため、このコードが他の入力に対して目的の出力を生成するかどうかはわかりません。

変数名の一部を変更し、提供されたコードの一部を並べ替えて、実際に物事を考えることができるようにしました。

#include <iostream>
using namespace std;

void main ()
{
    int *signal, *filter, signalLength = 0, filterLength = 0, i = 0;

    cout << "Enter size of signal and filter" << endl;
    cin >> signalLength >> filterLength;

    signal = new int [signalLength];
    filter = new int [filterLength];

    cout << "Enter  signal values" << endl;
    for (i = 0; i < signalLength; i++)
    {
        cin >> signal[i];
    }

    cout << "Enter filter  values" << endl;
    for (i = 0; i < filterLength; i++)
    {
        cin >> filter[i];
    }

    // It was a stated requirement that the filter array be smaller than
    // the signal array.
    // add a check here and act accordingly

    int outputLength = signalLength + filterLength - 1;
    int *output = new int[outputLength];
    int signalLeft = 0;
    int signalRight = 1;
    int filterLeft = 0;
    int filterRight = 1;
    int outputIndex = 0;
    while (signalLeft < signalLength)
    {
        int indexWidth = signalRight - signalLeft;


        // I sure hope I've interpretted your question correctly.
        // I recommend you read over this loop
        // carefully to ensure it matches your understanding of the problem at hand.
        output[outputIndex] = 0;
        int j = 0;
        while (j < indexWidth)
        {
            output[outputIndex] += signal[signalLeft + j] * 
                                   filter[filterRight - j - 1];

            ++j;
        }


        // The left and right indexes will start the loop 1 index apart
        // The right indexes will increment until the distance between
        //    left and right is equal to the length of the filter array.
        // Then, the signal indexes will increment until the right signal
        //   index is equal to the length of the signal array.
        // Then, both left indexes will increment until the left and right
        //   indexes are again 1 index apart.
        if (filterRight < filterLength)
        {
            ++signalRight;
            ++filterRight;
        }
        else if (signalRight < signalLength)
        {
            ++signalLeft;
            ++signalRight;
        }
        else
        {
            ++signalLeft;
            ++filterLeft;
        }

        ++outputIndex;
    }


    for (i = 0; i < outputLength; ++i)
    {
            cout << i << ": " << output[i] << endl;
    }


    char dummy;
    cin >> dummy;
}
于 2012-12-04T02:20:05.243 に答える
0

length の 3 つの配列があるとしますN

  • input1、最初の入力配列
  • input2、2 番目の入力配列
  • output、出力配列

次に、 for ifrom 0to N - 1、ループして into の結果を入れますinput1[i] * input2[i](ドット積output[i]と仮定)。

于 2012-12-03T22:46:51.813 に答える
0
int newLength = fSize1 + fSize2 - 1;

int *array3 = new int[newLength];
int count = 0;

// initialize all array3 value to 0
for(int k = 0; k<newLength; k++)
{
    array3[k] = 0;
}

for(int i = 0; i<newLength; i++)
{
    for(int j = 0; j<fSize2; j++)
    {
        // to avoid outofbound error
        if(i==0)
            array3[i] = array2[i] * array1[j];
        else
            array3[i] = array3[i- 1] + (array2[i] * array1[j]);
    }
}

お役に立てれば。

于 2012-12-04T02:29:48.773 に答える