进阶-线代和矩阵
简介
Z1h支持了矩阵的部分基础运算, 包括且不限于加、减、乘、除、转置矩阵和矩阵的逆运算等
如果有更多期望的矩阵运算, 欢迎到issue下提出
构建矩阵
一般通过 matrix
函数来构建一个矩阵
方法1, 通过字符串构建
matrix(`1 2 3 4 5 6 7 8 9`)
方法2, 通过字符串且指定行数来构建
print(matrix(`1 2 3 4 5 6 7 8`, 2)) // 2行4列 print(matrix(`1 2 3 4 5 6 7 8`, 4)) // 4行2列
方法3, 通过指定行和列来构建一个0值的矩阵
print(matrix(3, 4)) // 3行4列 print(matrix(4, 3)) // 4行3列
方法4, 指定初始值(浮点型)、行和列来构建
matrix(3.0, 4, 5)
方法5, 传入浮点型一维数组和行数重新组合成矩阵
matrix(floatarray(1, 2, 3, 4, 5, 6, 7, 8, 9), 3)
方法6, 传入另一个矩阵、行数重新组合成矩阵
var m1 = matrix(` 1 2 3 4 5 6`) var m2 = matrix(m1, 3) print(m1, ' & ', m2)
方法7, 传入整形数组、行数
matrix(range(9), 3)
方法8, 传入任意数组, 智能解析构建
matrix([1,2,3,4,5,6], 3) matrix([ [1,2,3], [4,5,6], [7,8,9], ])
矩阵运算
矩阵除了支持的加、减、乘、除等基础运算之外, 还提供了 转置
、逆矩阵
、行列式
等运算
以下运算相关的示例代码均以下方代码为背景, 请先在自己的测试环境自定义这些变量
m1 = matrix(range(9), 3)
m2 = matrix(2.0, 3, 3)
num = 4.0
基础运算
- 加法: 矩阵可以和数字相加, 也可以和矩阵相加
- 减法: 和加法类似
- 乘法: 可以和数字相乘, 也可以让
m*p
和p*n
的矩阵相乘 - 除法: 可以和数字相除
- 求余: 可以和数字进行求余
示例代码:
// 矩阵和数字相加
print(m1 + num)
// 矩阵之间相加
print(m1 + m2)
// 矩阵和数字相减
print(m1 - num)
// 矩阵之间相减
print(m1 - m2)
// 矩阵和数字相乘
print(m1 * num)
// 矩阵之间相乘
print(m1 * m2)
matrix(range(6), 3) * matrix(range(6), 2)
matrix(range(6), 2) * matrix(range(6), 3)
// 矩阵和数字相除
print(m1 - num)
// 矩阵和数字求余
print(m1 - num)
注意, 如果使用 +=
、-=
、/=
、\*=
、%=
运算符, 将会对左值的内容修改, 而且引用了同一个对象的变量也也将同时修改
// 演示 += 等操作符对矩阵的影响
a = matrix(1.0, 2, 2)
b = a
a += 8
print(b) // b引用的是同一个矩阵, 在+=之后也发生了改变
特殊运算
转置矩阵
矩阵的原型T
函数可以进行转置:
print(`转置前:`, m1)
print(`转置后:`, m1.T())
行列式
矩阵的原型D
函数可以计算矩阵的行列式:
matrix(`
1 2
3 4
`).D()
矩阵的逆运算
矩阵的原型I
函数可以进行矩阵的逆运算:
matrix(`
1 2
3 4
`).I()
其它原型函数
除了以上提到的T
(转置)、D
(行列式)、I
(逆运算)函数之外, 矩阵还支持几个原型函数:
random函数
将矩阵的内容重置为0-1之间的随机浮点值
matrix(3, 3).random()
reset函数
将矩阵的内容重置为固定值或函数运行返回值
m = matrix(3, 3)
m.reset(5) // 设置为固定值
print(m)
m.reset((origin, row, column) => {
print(`第${row+1}行第${column+1}列, 原来的值是${origin}`)
return origin + row * 10 + column * 100
})
print(m)