2017-02-01 2 views
1

У меня есть некоторые рабочий код, который я написал некоторое время назад, когда я создал свои собственные функции SUMPRODUCT, для выполнения этой операции на опалить и многомерные массивы:SUMPRODUCT многомерные массивы, используя mathJS

function sumProduct1D(m1, m2) { 
    var result = 0; 
    var len = m1.length; 
    for (var i = 0; i < len; i++) { 
     result += m1[i] * m2[i]; 
    } 
    return result; 
} 
function sumProduct2D(m1, m2) { 
    var result = 0; 
    var len1 = m1.length; 
    for (var i1 = 0; i1 < len1; i1++) { 
     var len2 = m1[i1].length; 
     for (var i2 = 0; i2 < len2; i2++) { 
      result += m1[i1][i2] * m2[i1][i2]; 
     } 
    } 
    return result; 
} 

(Эти функции проходят через оба массива, умножая связанные индексы и суммируя общее количество вместе - в случае, если вы не знакомы с sumProduct).

В какой-то момент я начал использовать mathJS для некоторых из его методов манипуляции матрица/массив, и я понял, что мой sumProduct1D такая же, как math.dot

var a = [1,2,3]; 
 
var b = [3,2,1]; 
 

 
console.log(sumProduct1D(a,b)); 
 
console.log(math.dot(a,b)); 
 

 
function sumProduct1D(m1, m2) { 
 
    var result = 0; 
 
    var len = m1.length; 
 
    for (var i = 0; i < len; i++) { 
 
    result += m1[i] * m2[i]; 
 
    } 
 
    return result; 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjs/3.8.0/math.js"></script>

Приведенный выше код дает тот же результат для моего и использования math.dot - отлично!


Мой вопрос вокруг моего другого метода - это подводит многомерный массив, и mathJS не любит его - я получаю сообщение об ошибке Uncaught RangeError: Vector expected.

var c = [[1,2,3],[1,2,3]]; 
 
var d = [[3,2,1],[3,2,1]]; 
 
console.log(sumProduct2D(c,d)) 
 
console.log(math.dot(c,d)) 
 

 
function sumProduct2D(m1, m2) { 
 
    var result = 0; 
 
    var len1 = m1.length; 
 
    for (var i1 = 0; i1 < len1; i1++) { 
 
    var len2 = m1[i1].length; 
 
    for (var i2 = 0; i2 < len2; i2++) { 
 
     result += m1[i1][i2] * m2[i1][i2]; 
 
    } 
 
    } 
 
    return result; 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjs/3.8.0/math.js"></script>

Я имел взгляд через mathJS документы, и я не могу за жизнь мне собрать комбинацию вызовов, которые дублируют мой sumProduct2D. Но должен быть способ.

Может ли кто-нибудь реплицировать мой метод sumProduct с использованием mathJS функций?

ответ

0

В случае, если это поможет кому-либо еще, я нашел ответ в конце концов. Это было math.sum(math.dotMultiply(c,d)) Я был после.

var c = [[1,2,3],[1,2,3]]; 
 
var d = [[3,2,1],[3,2,1]]; 
 
console.log(sumProduct2D(c,d)) 
 
console.log(math.sum(math.dotMultiply(c,d))) 
 

 
function sumProduct2D(m1, m2) { 
 
    var result = 0; 
 
    var len1 = m1.length; 
 
    for (var i1 = 0; i1 < len1; i1++) { 
 
    var len2 = m1[i1].length; 
 
    for (var i2 = 0; i2 < len2; i2++) { 
 
     result += m1[i1][i2] * m2[i1][i2]; 
 
    } 
 
    } 
 
    return result; 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjs/3.8.0/math.js"></script>

Смежные вопросы