#include <iostream>
#include <vector>
using namespace std;
vector<float> CONV(vector<float>& Y, vector<float>& X)
{
if (X.size() < Y.size()) X.resize(Y.size());
else Y.resize(X.size());
int d1_size = X.size();
int d2_size = Y.size();
int R_size = d1_size + d2_size - 1;
vector<float> out(R_size);
//convolution process
for (int i = 0; i < R_size; ++i)
{
int d1_limit = (i < d1_size - 1) ? i : d1_size - 1;
int d2_limit = (i < d2_size - 1) ? 0 : i - (d2_size - 1);
for (int j = d2_limit; j <= d1_limit; ++j)
{
out[i] += (X[j] * Y[i - j]);
}
}
// for (int i = R_size / 2; i < R_size; ++i)
// out.resize(R_size / 2);
return out;
}
int main()
{
vector<float> v1(20, 0.5);
vector<float> v2(20, 1);
vector <float> V = CONV(v1, v2);
for(int i = 0; i < V.size(); i++)
cout << V[i] << endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgogCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKdmVjdG9yPGZsb2F0PiBDT05WKHZlY3RvcjxmbG9hdD4mIFksIHZlY3RvcjxmbG9hdD4mIFgpCnsKIAoJaWYgKFguc2l6ZSgpIDwgWS5zaXplKCkpIFgucmVzaXplKFkuc2l6ZSgpKTsKCWVsc2UgWS5yZXNpemUoWC5zaXplKCkpOwogCglpbnQgZDFfc2l6ZSA9IFguc2l6ZSgpOwoJaW50IGQyX3NpemUgPSBZLnNpemUoKTsKCWludCBSX3NpemUgPSBkMV9zaXplICsgZDJfc2l6ZSAtIDE7CiAKCXZlY3RvcjxmbG9hdD4gb3V0KFJfc2l6ZSk7CiAKCS8vY29udm9sdXRpb24gcHJvY2VzcyAKCWZvciAoaW50IGkgPSAwOyBpIDwgUl9zaXplOyArK2kpCgl7CgkJaW50IGQxX2xpbWl0ID0gKGkgPCBkMV9zaXplIC0gMSkgPyBpIDogZDFfc2l6ZSAtIDE7CgkJaW50IGQyX2xpbWl0ID0gKGkgPCBkMl9zaXplIC0gMSkgPyAwIDogaSAtIChkMl9zaXplIC0gMSk7CiAKCQlmb3IgKGludCBqID0gZDJfbGltaXQ7IGogPD0gZDFfbGltaXQ7ICsraikKCQl7CgkJCW91dFtpXSArPSAoWFtqXSAqIFlbaSAtIGpdKTsKCQl9Cgl9CiAKLy8JZm9yIChpbnQgaSA9ICBSX3NpemUgLyAyOyBpIDwgUl9zaXplOyArK2kpCgkvLwlvdXQucmVzaXplKFJfc2l6ZSAvIDIpOwoJcmV0dXJuIG91dDsKfQogCmludCBtYWluKCkKewogCgl2ZWN0b3I8ZmxvYXQ+IHYxKDIwLCAwLjUpOwoJdmVjdG9yPGZsb2F0PiB2MigyMCwgMSk7Cgl2ZWN0b3IgPGZsb2F0PiBWID0gQ09OVih2MSwgdjIpOwogCglmb3IoaW50IGkgPSAwOyBpIDwgVi5zaXplKCk7IGkrKykKCSAgICBjb3V0IDw8IFZbaV0gPDwgZW5kbDsKfQ==