First off, I know my title can be formulated better, but my math classes are so far gone I can't remember the correct words anymore..
I need to do something like this (pseudo c#)
int[] digits1 = new int[10]{0,1,2,3,4,5,6,7,8,9};
int[] digits2 = new int[10]{0,1,2,3,4,5,6,7,8,9};
int result = digits1*digits2
This would be the sum of the product of element[i] of each array.
This obviously doesn't work. Any suggestions towards either a better title or the solution?
EDIT clarification: I know I could loop them both and do the math. Basically I would think there is a better way to do this and I'm looking for it purely out of personal curiousity.
The dot product of two vectors is the sum of the products of elements with regards to position. The first element of the first vector is multiplied by the first element of the second vector and so on. The sum of these products is the dot product which can be done with np.
Each element in A has to be multiplied with exactly one element in B or vice versa such that each element of both the arrays appears exactly once and the sum of the product obtained is maximum. Explanation : Maximum sum of product is obtained by 5*3+4*2+1*1 = 24.
The idea is to start traversing both the array simultaneously from the end until we reach the 0th index of either of the array. While traversing each elements of array, add element of both the array and carry from the previous sum. Now store the unit digit of the sum and forward carry for the next index sum.
With LINQ:
int dotProduct = digits1.Zip(digits2, (d1, d2) => d1 * d2)
.Sum();
Zip
will produce a streaming sequence containing the products of corresponding elements from both arrays, which is then summed into an integer with Sum
.
Note that this will not fail like it should when the arrays of unequal length, so you probably need to validate the input:
//null checks here
if(digits1.Length != digits2.Length)
throw new ArgumentException("...");
EDIT:
As Jeff M points out,Enumerable.Zip
was only added to the framework in .NET 4.0. In .NET 3.5, you can do this (the idea is only efficient for collections that expose fast indexers):
int dotProduct = Enumerable.Range(0, digits1.Length)
.Sum(i => digits1[i] * digits2[i]);
//from Jeff M's comment:
int dotProduct = digits1.Select((n, i) => n * digits2[i])
.Sum();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With