行列と行列演算

行列は、多くの数学関数の入力と出力の両方として使用されます。ユーザーガイドのこのセクションでは、行列の作成、操作、および行列演算の基本について説明します。

行列

行列は、`matrix` 関数を使用して作成できます。 `matrix` 関数には、行列の**行**を表す `配列` のリストが渡されます。

以下の例では、2x2 の行列を作成します。

matrix(array(1, 2),
       array(4, 5))

この式が `/stream` ハンドラに送信されると、次のようなレスポンスが返されます。

{
  "result-set": {
    "docs": [
      {
        "return-value": [
          [
            1,
            2
          ],
          [
            4,
            5
          ]
        ]
      },
      {
        "EOF": true,
        "RESPONSE_TIME": 0
      }
    ]
  }}

行と列のラベル

行列には、列と行、およびラベルを設定できます。 `setRowLabels`、`setColumnLabels`、`getRowLabels`、`getColumnLabels` 関数を使用して、ラベルを設定および取得できます。ラベル値は文字列配列を使用して設定されます。

以下の例では、行と列のラベルを設定します。ユーザーガイドの他のセクションでは、関数が既に設定されたラベルを持つ行列を返す例が示されています。

以下は、行列に行と列のラベルを設定および取得する簡単な例です。

let(echo="d, e",
    a=matrix(array(1, 2),
             array(4, 5)),
    b=setRowLabels(a, array("rowA", "rowB")),
    c=setColumnLabels(b, array("colA", "colB")),
    d=getRowLabels(c),
    e=getColumnLabels(c))

この式が `/stream` ハンドラに送信されると、次のようなレスポンスが返されます。

{
  "result-set": {
    "docs": [
      {
        "d": [
          "rowA",
          "rowB"
        ],
        "e": [
          "colA",
          "colB"
        ]
      },
      {
        "EOF": true,
        "RESPONSE_TIME": 0
      }
    ]
  }
}

可視化

`zplot` 関数は、`heat` 名前付きパラメータを使用して、行列をヒートマップとしてプロットできます。ヒートマップは、ガイドの後半で説明する**相関**と**距離**行列を表示するための強力な可視化ツールです。以下の例は、Apache Zeppelin のヒートマップ可視化を使用して可視化された 2x2 行列を示しています。

以下の可視化では、行は**下**から上に読み取られます。これは、ヒートマップの一般的な規則です。
matrix

行と列へのアクセス

行列の行と列には、`rowAt` および `colAt` 関数を使用してアクセスできます。

以下の例では、2 x 2 の行列を作成し、行列の 2 番目の列を返します。この例では、行列には配列のリストが直接渡されるのではなく、変数が渡されていることに注意してください。

let(a=array(1, 2),
    b=array(4, 5),
    c=matrix(a, b),
    d=colAt(c, 1))

この式が `/stream` ハンドラに送信されると、次のようなレスポンスが返されます。

{
  "result-set": {
    "docs": [
      {
        "d": [
          2,
          5
        ]
      },
      {
        "EOF": true,
        "RESPONSE_TIME": 0
      }
    ]
  }
}

行列属性

行列には、任意の数の名前付き属性を関連付けることもできます。 `termVectors` 関数など、特定の関数は、行列内のデータを記述する属性を含む行列を返します。

属性は、`getAttribute` 関数を使用して名前で取得でき、属性マップ全体は `getAttributes` 関数を使用して取得できます。

行列の次元

行列の次元は、`rowCount` および `columnCount` 関数を使用して決定できます。

以下の例では、行列の次元を取得します。

let(echo="b,c",
    a=matrix(array(1, 2, 3),
             array(4, 5, 6)),
    b=rowCount(a),
    c=columnCount(a))

この式が `/stream` ハンドラに送信されると、次のようなレスポンスが返されます。

{
  "result-set": {
    "docs": [
      {
        "b": 2,
        "c": 3
      },
      {
        "EOF": true,
        "RESPONSE_TIME": 0
      }
    ]
  }
}

行列の転置

行列は、`transpose` 関数を使用して転置できます。

行列の転置の例を以下に示します。

let(a=matrix(array(1, 2),
             array(4, 5)),
    b=transpose(a))

この式が `/stream` ハンドラに送信されると、次のようなレスポンスが返されます。

{
  "result-set": {
    "docs": [
      {
        "b": [
          [
            1,
            4
          ],
          [
            2,
            5
          ]
        ]
      },
      {
        "EOF": true,
        "RESPONSE_TIME": 24
      }
    ]
  }
}

行列の合計

行列の行と列は、`sumRows` および `sumColumns` 関数で合計できます。以下は、各行の合計を含む配列を返す `sumRows` 関数の例です。

let(a=matrix(array(1, 2, 3),
             array(4, 5, 6)),
    b=sumRows(a))

この式が `/stream` ハンドラに送信されると、次のようなレスポンスが返されます。

{
  "result-set": {
    "docs": [
      {
        "b": [
          6,
          15
        ]
      },
      {
        "EOF": true,
        "RESPONSE_TIME": 2
      }
    ]
  }
}

`grandSum` 関数は、行列内のすべての値の合計を返します。以下は、`grandSum` 関数の例です。

let(a=matrix(array(1, 2, 3),
             array(4, 5, 6)),
    b=grandSum(a))

この式が `/stream` ハンドラに送信されると、次のようなレスポンスが返されます。

{
  "result-set": {
    "docs": [
      {
        "b": 21
      },
      {
        "EOF": true,
        "RESPONSE_TIME": 0
      }
    ]
  }
}

スカラー行列演算

ベクトルに適用されるのと同じスカラー数学関数を行列にも適用できます。`scalarAdd`、`scalarSubtract`、`scalarMultiply`、`scalarDivide`。

以下は、行列の各要素にスカラー値を追加する`scalarAdd`関数の例です。

let(a=matrix(array(1, 2),
             array(4, 5)),
    b=scalarAdd(10, a))

この式が `/stream` ハンドラに送信されると、次のようなレスポンスが返されます。

{
  "result-set": {
    "docs": [
      {
        "b": [
          [
            11,
            12
          ],
          [
            14,
            15
          ]
        ]
      },
      {
        "EOF": true,
        "RESPONSE_TIME": 0
      }
    ]
  }
}

行列の加算と減算

2つの行列は、`ebeAdd`関数と`ebeSubtract`関数を使用して加算および減算できます。これらの関数は、行列の要素ごとの加算と減算を実行します。

以下は、`ebeAdd`を使用して行列をそれ自体で要素ごとに加算する簡単な例です。

let(a=matrix(array(1, 2),
             array(4, 5)),
    b=ebeAdd(a, a))

この式が `/stream` ハンドラに送信されると、次のようなレスポンスが返されます。

{
  "result-set": {
    "docs": [
      {
        "b": [
          [
            2,
            4
          ],
          [
            8,
            10
          ]
        ]
      },
      {
        "EOF": true,
        "RESPONSE_TIME": 0
      }
    ]
  }
}

行列の乗算

行列の乗算は、`matrixMult`関数を使用して実行できます。以下は、行列乗算の簡単な例です。

let(a=matrix(array(1, 2),
             array(4, 5)),
    b=matrix(array(11, 12),
             array(14, 15)),
    c=matrixMult(a, b))

この式が `/stream` ハンドラに送信されると、次のようなレスポンスが返されます。

{
  "result-set": {
    "docs": [
      {
        "c": [
          [
            39,
            42
          ],
          [
            114,
            123
          ]
        ]
      },
      {
        "EOF": true,
        "RESPONSE_TIME": 0
      }
    ]
  }
}