Let’s suppose I have n arrays, where n is a variable (some number greater than 2, usually less than 10).
Each array has k elements.
I also have an array of length n that contains a set of weights that dictate how I would like to linearly combine all the arrays.
I am trying to create a high performance higher order function to combine these arrays in F#.
How can I do this, so that I get a function that takes an array of arrays (arrs is a sample), a weights array (weights), and then computed a weighted sum based on the weights?
let weights = [|.6;;.3;.1|]
let arrs = [| [|.0453;.065345;.07566;1.562;356.6|] ;
[|.0873;.075565;.07666;1.562222;3.66|] ;
[|.06753;.075675;.04566;1.452;3.4556|] |]
thanks for any ideas.
Here’s one solution:
EDIT
Here’s some (much needed) explanation of how this works. Logically, we want to do the following:
The two lines above do just that.
Array.map2function to combine corresponding weights and rows; the way that we combine them is to multiply each element in the row by the weight, which is accomplished via the innerArray.map.Array.map2again, using(+)as the function for combining the elements from each. We wrap this in anArray.reduceto apply this addition function to each row in turn, starting with the first row.Hopefully this is a reasonably elegant approach to the problem, though the point-free style admittedly makes it a bit tricky to follow. However, note that it’s not especially performant; doing in-place updates rather than creating new arrays with each application of
map,map2, andreducewould be more efficient. Unfortunately, the standard library doesn’t contain nice analogues of these operations which work in-place. It would be relatively easy to create such analogues, though, and they could be used in almost exactly the same way as I’ve done here.