0

我正在使用math.js库中的矩阵元素。

我创建一个矩阵:

 let eye = math.matrix([
    [1, 0, 0],
    [0, 1, 0],
    [0, 0, 1]
    ]);

但是当我尝试访问矩阵的元素时,它总是未定义的。

console.log(eye[0][0]) -> undefined 
console.log(eye[0])  -> undefined 

有什么建议么?我已经阅读了 math.js 库的文档,但我没有看到有关如何访问单个元素的信息。

而且我确实需要使用这个库,因为我正在做基于矩阵的运算(矩阵乘法)。

4

3 回答 3

1

如果你打印出来eye,你会得到以下对象。

{
  _mathjs: "DenseMatrix",
  _data: [
    [ 1, 0, 0 ],
    [ 0, 1, 0 ],
    [ 0, 0, 1 ]
  ],
  _size: [ 3, 3 ]
}

但这只是用于保存有关矩阵信息的内部结构,您需要调用文档中所见的辅助方法。

如果你想访问数据,你总是可以matrix直接查询内部数据。这是一个坏主意,因为这些字段都被视为私有的;内部字段(以下划线开头)。

const __print = (x) => console.log(JSON.stringify(x));

let eye = math.matrix([
  [1, 0, 0],
  [0, 1, 0],
  [0, 0, 1]
]);
   
__print(eye._data[0][0]); // 1

__print(eye._data[0]);    // [1, 0, 0]
__print(eye._data[1]);    // [0, 1, 0]
__print(eye._data[2]);    // [0, 0, 1]
.as-console-wrapper { top: 0; max-height: 100% !important; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjs/8.1.1/math.js"></script>

建议您使用库中可用的辅助方法。

注意:在微调我的回复后,我在 GitHub 上的Issue #230中找到了类似的检索行的方法。

您需要计算出矩阵中的列数。之后,您可以从所需的行索引开始获取一个子集,范围为 0 到行中的列数。然后必须将结果展平。

const __print = (x) => console.log(JSON.stringify(x));

let eye = math.matrix([
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9]
]);

const __row = (m, r) =>
  (([ rows, cols ]) => math.flatten(math.subset(m,
    math.index(r, math.range(0, cols))).valueOf()))
  (m.size());
  
const __col = (m, c) =>
  (([ rows, cols ]) => math.flatten(math.subset(m,
    math.index(math.range(0, rows), c)).valueOf()))
  (m.size());
  
const __cell = (m, r, c) =>
  math.subset(m, math.index(r, c));

__print(__cell(eye, 0, 0)); // 1

__print(__row(eye, 0));     // [1, 2, 3]
__print(__row(eye, 1));     // [4, 5, 6]
__print(__row(eye, 2));     // [7, 8, 9]

__print(__col(eye, 0));     // [1, 4, 7]
__print(__col(eye, 1));     // [2, 5, 8]
__print(__col(eye, 2));     // [3, 6, 9]
.as-console-wrapper { top: 0; max-height: 100% !important; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjs/8.1.1/math.js"></script>

事实证明它们已经实现了,但是您仍然需要将结果展平。

const __print = (x) => console.log(JSON.stringify(x));

let eye = math.matrix([
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9]
]);

const __row = (m, r) =>
  math.flatten(math.row(m, r).valueOf());
  
const __col = (m, c) =>
  math.flatten(math.column(m, c).valueOf());
  
const __cell = (m, r, c) =>
  math.subset(m, math.index(r, c));

__print(__cell(eye, 0, 0)); // 1

__print(__row(eye, 0));     // [1, 2, 3]
__print(__row(eye, 1));     // [4, 5, 6]
__print(__row(eye, 2));     // [7, 8, 9]

__print(__col(eye, 0));     // [1, 4, 7]
__print(__col(eye, 1));     // [2, 5, 8]
__print(__col(eye, 2));     // [3, 6, 9]
.as-console-wrapper { top: 0; max-height: 100% !important; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjs/8.1.1/math.js"></script>

于 2021-01-14T19:34:58.567 回答
1

你试图达到眼睛的内容,好像眼睛是二维 js 数组,这绝对不是真的。math.matrix 返回一些对象,调查其结构的最佳方法是 console.log(eye) (在 Chrome 或其他现代浏览器中)。或/并阅读有关 it 方法的文档

于 2021-01-14T19:48:17.100 回答
0

您可能想尝试将两者结合起来subsetindex在索引处获取值。

资料来源:mathjs

math.subset(eye, math.index(0, 0)) // 1
math.subset(eye, math.index(0, 1)) // 0
于 2021-01-14T19:34:14.157 回答