diff --git a/src/NumSharp/Extensions/NdArray.Convolve.cs b/src/NumSharp/Extensions/NdArray.Convolve.cs new file mode 100644 index 000000000..211c56a57 --- /dev/null +++ b/src/NumSharp/Extensions/NdArray.Convolve.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using NumSharp; + +namespace NumSharp.Extensions +{ + public static partial class NDArrayExtension + { + /// + /// Convolution of 2 series + /// + /// + /// + /// + /// + public static NDArray Convolve(this NDArray numSharpArray1, NDArray numSharpArray2, string mode = "full") + { + int nf = numSharpArray1.Length; + int ng = numSharpArray2.Length; + + var numSharpReturn = new NDArray(); + + if (mode.Equals("full")) + { + int n = nf + ng - 1; + + var out_ = new double[n]; + + for (int idx = 0; idx < n; ++idx) + { + int jmn = (idx >= ng - 1) ? (idx - (ng - 1)) : 0; + int jmx = (idx < nf - 1) ? idx : nf - 1; + + for (int jdx = jmn; jdx <= jmx; ++jdx ) + { + out_[idx] += ( numSharpArray1[jdx] * numSharpArray2[idx - jdx] ); + } + } + + numSharpReturn.Data = out_; + } + else + { + + } + + return numSharpReturn; + } + } + } \ No newline at end of file diff --git a/test/NumSharp.UnitTest/Extensions/NdArray.Convolve.Test.cs b/test/NumSharp.UnitTest/Extensions/NdArray.Convolve.Test.cs new file mode 100644 index 000000000..c8e1fae46 --- /dev/null +++ b/test/NumSharp.UnitTest/Extensions/NdArray.Convolve.Test.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Text; +using NumSharp.Extensions; +using System.Linq; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace NumSharp.UnitTest.Extensions +{ + /// + /// Test concolve with standard example from + /// https://www.numpy.org/devdocs/reference/generated/numpy.convolve.html + /// + [TestClass] + public class NdArrayConvolveTest + { + [TestMethod] + public void ConvoleFull() + { + var series1 = new NDArray(); + series1.Data = new double[]{1, 2, 3}; + + var series2 = new NDArray(); + series2.Data = new double[]{0, 1, 0.5}; + + var series3 = series1.Convolve(series2); + + double[] expectedResult = new double[]{0, 1, 2.5, 4, 1.5}; + + Assert.IsTrue(Enumerable.SequenceEqual(series3.Data.ToArray(), expectedResult)); + } + [TestMethod] + public void ConvoleValid() + { + // To be done + } + [TestMethod] + public void ConvoleSame() + { + // To be done + } + + } +} \ No newline at end of file