进阶-线代和矩阵

简介

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*pp*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)