本帖最后由 王明禹 于 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]
|
|