分享

MapReduce实现多矩阵乘法计算,Map准备数据,Reduce无法实现分布式计算问题

本帖最后由 王明禹 于 2016-7-3 22:11 编辑

编写一个算法,使用MapReduce编程模型实现,如果说单机伪分布式运行的话,思想很简单,用Map读入数据,然后Reduce执行多矩阵计算,也可以出现结果。但是如果想要进行分布式计算的话,到Reduce阶段不知道如何实现多个矩阵的运算,问题如下:如果说将数据量较大,将数据分割并分配给各个Reduce会造成数据不全的结果,因为数据是矩阵,分开的话据无法真确的计算。网上的关于大数据进行矩阵乘法的代码很多,但是如果说计算一次就要调用一次矩阵计算Mapreduce算法,本人感觉不太现实,现在的问题就是有没有前辈给出一些更好的解决办法,能够解决Reduce进行多个复杂计算问题。要实现的复杂矩阵运算部分代码如下:[mw_shl_code=java,true]        
Ri = MatrixTool.diag(index);
                        float[] h1 = new float[1];
                        h1[0] = V[(int) fbus[vi[0]]];
                        float[] h2 = new float[npi];
                        float[] h3 = new float[nqi];
                        float[] h4 = new float[npf];
                        float[] h5 = new float[nqf];

                        for (int i = 0; i < npi; i++) {
                                int m = (int) (fbus[ppi] - 1);
                                for (int k = 0; k < nbus; k++) {
                                        h2 = (float) (h2 + V[m]
                                                        * V[k]
                                                        * (G[m][k] * Math.cos(del[m] - del[k]) + B[m][k]
                                                                        * Math.sin(del[m] - del[k])));
                                }
                        }
                        for (int i = 0; i < nqi; i++) {
                                int m = (int) (fbus[qi] - 1);
                                for (int k = 0; k < nbus; k++) {
                                        h3 = (float) (h3 + V[m]
                                                        * V[k]
                                                        * (G[m][k] * Math.sin(del[m] - del[k]) - B[m][k]
                                                                        * Math.cos(del[m] - del[k])));
                                }
                        }
                        
                        for (int i = 0; i < npf; i++) {
                                int m = (int) fbus[pf] - 1;
                                int n = (int) tbus[pf] - 1;
                                h4 = (float) (-Math.pow(V[m], 2) * G[m][n] - V[m]
                                                * V[n]
                                                * (-G[m][n] * Math.cos(del[m] - del[n]) - B[m][n]
                                                                * Math.sin(del[m] - del[n])));
                        }
                        for (int i = 0; i < nqf; i++) {
                                int m = (int) (fbus[qf] - 1);
                                int n = (int) (tbus[qf] - 1);
                                h5 = (float) (-Math.pow(V[m], 2) * (-B[m][n] + Bbus[m][n]) - V[m]
                                                * V[n]
                                                * (-G[m][n] * Math.sin(del[m] - del[n]) + B[m][n]
                                                                * Math.cos(del[m] - del[n])));
                        }
                        float[] h = MatrixUnit.MultiMerge(h1, h2, h3, h4, h5);
                        // MatrixTool.arrayPrint(h);
                        float[][] r = new float[z.length][1];
                        for (int i = 0; i < z.length; i++) {
                                r[0] = z - h;
                        }
                        float[][] H11 = new float[nvi][nbus - 1];
                        float[][] H12 = new float[nvi][nbus];
                        for (int k = 0; k < nvi; k++) {
                                for (int n = 0; n < nbus; n++) {
                                        if (n == k) {
                                                H12[k][n] = 1;
                                        }
                                }
                        }
[/mw_shl_code]

已有(4)人评论

跳转到指定楼层
desehawk 发表于 2016-7-4 06:56:12
楼主是否把矩阵的数据打散了,所以会造成数据不全。

map里面是以矩阵为单位。


推荐参考
MapReduce实现大矩阵乘法
http://www.aboutyun.com/forum.php?mod=viewthread&tid=8161


回复

使用道具 举报

王明禹 发表于 2016-7-4 10:41:48
desehawk 发表于 2016-7-4 06:56
楼主是否把矩阵的数据打散了,所以会造成数据不全。

map里面是以矩阵为单位。

您好,您所提供的代码我已经我的问题叙述中提到了,这个段代码的确是适用于大数据的矩阵乘法, 但是如我的这段代码所示,不可能进行一次乘法就调用该这个矩阵乘法算法,而且这样做也可以,就是不知道实现过程中的数据传递会很混乱,我不知道我说的对不对,是我再设计过程中的个人见解,PS:这样的逻辑加一起有15个,您看还有更好的解决办法吗?
回复

使用道具 举报

王明禹 发表于 2016-7-4 21:57:07
看来真的没有很好地解决办法了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条