我是javascript的新手并且有问题。我正在使用OPL进行数学编程,在我的执行块中我可以使用javascript。
我有一个3D矩阵:
A[tier][row][column]=
[[[ 1 7 13 19 25 ]
[ 3 9 15 21 27 ]
[ 5 11 17 23 29 ]
[ 7 13 19 25 31 ]],
[[2 8 14 20 26]
[4 10 16 22 28]
[6 12 18 24 30]
[8 14 20 26 32]], ];
和第二个布尔矩阵如下:
B[t][r][c] =
[[[ 1 0 0 0 0 ]
[ 0 0 0 0 0 ]
[ 0 1 0 0 0 ]
[ 0 0 0 0 0 ]]
[0 0 1 0 0]
[0 1 0 0 0]
[0 0 0 0 0]
[0 0 0 0 0]], ];
现在我想总结一下A矩阵的值,其中矩阵B是1。这里就像:1 + 11 + 14 + 10(只是为了弄清楚我的问题是什么)。
我的想法是:
for (var t in Tier)
for (var r in Row)
for (var c in Column) {
val = 0;
if ( B[t][r][c] == 1 )
//get the value of A[t][r][c] and add it to val and give the sum of val out
}
你能帮帮我吗?我不知道如何制定它..
亲切的问候
吨。
答案 0 :(得分:0)
您可以使用Array#forEach
迭代数组a
并测试b
是否包含用于求和的真值。
var a = [[[1, 7, 13, 19, 25], [3, 9, 15, 21, 27], [5, 11, 17, 23, 29], [7, 13, 19, 25, 31]], [[2, 8, 14, 20, 26], [4, 10, 16, 22, 28], [6, 12, 18, 24, 30], [8, 14, 20, 26, 32]]],
b = [[[1, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 1, 0, 0, 0], [0, 0, 0, 0, 0]], [[0, 0, 1, 0, 0], [0, 1, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]],
sum = 0;
a.forEach(function (t, i) {
t.forEach(function (r, j) {
r.forEach(function (c, k) {
sum += b[i][j][k] ? c : 0;
});
});
});
console.log(sum);
ES6与Array#reduce
var a = [[[1, 7, 13, 19, 25], [3, 9, 15, 21, 27], [5, 11, 17, 23, 29], [7, 13, 19, 25, 31]], [[2, 8, 14, 20, 26], [4, 10, 16, 22, 28], [6, 12, 18, 24, 30], [8, 14, 20, 26, 32]]],
b = [[[1, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 1, 0, 0, 0], [0, 0, 0, 0, 0]], [[0, 0, 1, 0, 0], [0, 1, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]],
sum = a.reduce((s, t, i) =>
s + t.reduce((s, r, j) =>
s + r.reduce((s, c, k) => s + b[i][j][k] * c, 0), 0), 0);
console.log(sum);
答案 1 :(得分:0)
您也可以使用简单的for循环:
var A = [[[ 1 7 13 19 25 ]
[ 3 9 15 21 27 ]
[ 5 11 17 23 29 ]
[ 7 13 19 25 31 ]],
[[2 8 14 20 26]
[4 10 16 22 28]
[6 12 18 24 30]
[8 14 20 26 32]], ],
B = [[[ 1 0 0 0 0 ]
[ 0 0 0 0 0 ]
[ 0 1 0 0 0 ]
[ 0 0 0 0 0 ]]
[0 0 1 0 0]
[0 1 0 0 0]
[0 0 0 0 0]
[0 0 0 0 0]], ],
maxTier=A.length,
maxRow = A[0].length,
maxColumn = A[0][0].length,
val = 0;
for(var t=0;t<maxTier;t++){
for(var r=0;r<maxRow;r++){
for(var c=0;c<maxColumn;c++){
if ( B[t][r][c] == 1 )
val+=A[t][r][c];
}
}
}
}