在javascript中的Kronecker张量产品

时间:2017-05-06 18:19:34

标签: javascript matlab

我需要计算两个矩阵的Kronecker乘积(如MatLab中的kron()函数)。我似乎无法在它上面找到任何代码,也许有人有一个躺在他们的计算机上准备使用?我已经搜索过GitHub,但它们似乎都没有正常工作。

https://en.wikipedia.org/wiki/Kronecker_product

所以例如:
A = [1, 2]; B = [3, 4]; C =kroneckerProduct(A,B)

然后,C将给出[3,4,6,8]

1 个答案:

答案 0 :(得分:1)

我不知道这个话题,我不得不把它读出来。所以我不完全确定代码是否正常(对于每个输入),尽管我检查了一些我在网上找到的例子。

function mapAB(a,b,fn){
    var k=0, out = Array(a.length*b.length);
    for(var i=0; i<a.length; ++i)
        for(var j=0; j<b.length; ++j)
            out[k++] = fn(a[i], b[j]);
    return out;
}

function kroneckerProduct(a,b){
    return Array.isArray(a)?
        Array.isArray(b)? 
            mapAB(a,b, kroneckerProduct):
            a.map(v => kroneckerProduct(v, b)):
        Array.isArray(b)? 
            b.map(v => kroneckerProduct(a, v)):
            a*b;
}

function mapAB(a, b, fn) {
  var k = 0,
    out = Array(a.length * b.length);
  for (var i = 0; i < a.length; ++i)
    for (var j = 0; j < b.length; ++j)
      out[k++] = fn(a[i], b[j]);
  return out;
}

function kroneckerProduct(a, b) {
  return Array.isArray(a) ?
    Array.isArray(b) ?
    mapAB(a, b, kroneckerProduct) :
    a.map(v => kroneckerProduct(v, b)) :
    Array.isArray(b) ?
    b.map(v => kroneckerProduct(a, v)) :
    a * b;
}

function compute() {
  var a = document.getElementById("a").value;
  var b = document.getElementById("b").value;
  var text;
  try {
    text = JSON.stringify(kroneckerProduct(
      JSON.parse(a.trim()),
      JSON.parse(b.trim())
    ), null, 2);
  } catch (err) {
    text = err;
  }

  document.getElementById("out").innerHTML = text;

}
<input id=a value=[1,2]><br>
<input id=b value=[3,4]><br>
<input type=button value=compute onclick=compute()>
<div id=out></div>