2017-02-01 7 views
1

Ich habe einigen Arbeitscode, die ich vor einiger Zeit geschrieben, wo ich meine eigenen SUMPRODUCT Funktionen erstellt, zur Durchführung dieser Operation auf ein- und mehrdimensionale Arrays:SUMPRODUCT mehrdimensionale Array mit 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; 
} 

(Diese Funktionen durchlaufen beide Arrays multiplizieren zugehörige Indizes und addieren die Summe alle zusammen - falls Sie nicht mit sumProduct vertraut sind).

Irgendwann habe ich mit mathJS für einige seiner Matrix/Array Manipulationsmethoden begonnen und ich erkannte, dass mein sumProduct1D ist die gleiche wie 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>

Der obige Code gibt die gleiche Ergebnis für meine und Verwendung math.dot - perfekt!


Meine Frage ist, um meine anderen Verfahren - es ein mehrdimensionales Array fasst, und mathJS mag nicht - ich erhalte eine Fehlermeldung 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>

Ich habe einen Blick durch die mathJS docs hatte, und ich kann mich nicht für das Leben von der Kombination der Anrufe zusammen, die meine sumProduct2D duplizieren. Aber es muss einen Weg geben.

Kann jemand meine sumProduct Methode mit mathJS Funktionen replizieren?

Antwort

0

Falls dies jemand anderen hilft, fand ich die Antwort schließlich. Es war math.sum(math.dotMultiply(c,d)) Ich war nach.

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>