首页 > 解决方案 > 如何使用 map reduce 进行多维向量乘法?

问题描述

我试图关注这篇文章:https ://developerzen.com/introduction-to-mapreduce-for-net-developers-1030e070698a

我对 map-reduce 函数很陌生,我没有正确理解它们,我的任务是找到两个向量的点积。通用 Map Reduce 代码:

class MyMapReduce<K1, V1, K2, V2, R>
{
    public delegate IEnumerable<KeyValuePair<K2, V2>> MapFunction(K1 key, V1 value);
    public delegate IEnumerable<R> ReduceFunction(K2 key, IEnumerable<V2> values);

    private MapFunction map;
    private ReduceFunction reduce;

    public MyMapReduce(MapFunction m, ReduceFunction r)
    {
        map = m;
        reduce = r;
    }


    private IEnumerable<KeyValuePair<K2, V2>> Map(IEnumerable<KeyValuePair<K1,V1>> input)
    {
        var intermediateResult = from pair in input from mapped in map(pair.Key, pair.Value) select mapped;
        return intermediateResult;
    }

    private IEnumerable<KeyValuePair<K2,R>> Reduce(IEnumerable<KeyValuePair<K2, V2>> intermediateValues)
    {
        var groups = from pair in intermediateValues group pair.Value by pair.Key into g select g;
        var reduced = from g in groups let k2 = g.Key from reducedValue in reduce(k2, g) select new KeyValuePair<K2, R>(k2, reducedValue);
        return reduced;
    }

    public IEnumerable<KeyValuePair<K2,R>> Execute(IEnumerable<KeyValuePair<K1, V1>> input)
    {
        return Reduce(Map(input));
    }
}

我的程序.cs:

class Program
{
    static void Main(string[] args)
    {
        List<KeyValuePair<string, int[]>> inputData = new List<KeyValuePair<string, int[]>>()
        {
            new KeyValuePair<string, int[]>("file1",new int[] { 1,2 }),
            new KeyValuePair<string, int[]>("file2",new int[] { 3,4 }),
        };

        MyMapReduce<string, int[], string, int[], int> master = new MyMapReduce<string, int[], string, int[], int>(MapFromMem, Reduce);

        var result = master.Execute(inputData).ToDictionary(k => k.Key, v => v.Value);
        foreach (var item in result)
        {
            Console.WriteLine(item + ": " + item.Value);
        }
    }

    public static IList<KeyValuePair<string, int[]>> MapFromMem()
    {
        //
    }

    public static IEnumerable<int> Reduce()
    {
        //
    }
}

这里我需要在 MapFromMem 和 Reduce 中做什么来实现点积?

标签: c#mapreduce

解决方案


推荐阅读