App Inventor 2 矩阵块


矩阵是什么

矩阵就是按行、列排好的数值表格。 下面的成绩单就是一个 2 行 3 列的矩阵(记作 2×3):

  语文 数学 英语
小明 90 85 88
小红 92 95 90

先数行、再数列:2×3 = 2 行 3 列。行、列的位置合起来叫单元格,比如”第 1 行第 2 列”是 85。

什么时候用矩阵,什么时候用嵌套列表? App Inventor 的列表也能套列表存表格,两者怎么选:

对比项 矩阵 嵌套列表
单元格内容 只能是数字 任意(文本、列表、组件都行)
按行列读写 专用块,一次到位 要两层”选取列表项”套着写
数学运算 加减乘、转置、求逆、旋转都是现成的块 全部要自己写循环
维度 支持三维及以上 想套几层套几层

一句话:纯数字的表格数据(棋盘、成绩表、像素、坐标)优先用矩阵;要存混合内容才用嵌套列表。

使用矩阵块前,记住三条铁律:

  1. 索引从 1 开始:与 App Inventor 列表一致,左上角是第 1 行第 1 列,不是第 0 行第 0 列。写惯了从 0 数的代码,这里最容易踩坑。
  2. 索引个数 = 维度数:2 维矩阵取一个单元格,要给”行、列”两个索引;三维矩阵给三个。
  3. 矩阵是纯数值的:单元格里只能放数字。想把文本存进格子,会在运行时报错。

第一个例子——创建一个 2×2 矩阵,取出第 2 行第 1 列的值(结果是 4):

<xml xmlns="http://www.w3.org/1999/xhtml"><block type="matrices_get_cell" x="20" y="20"><mutation items="2"></mutation><value name="MATRIX"><block type="matrices_create"><mutation rows="2" cols="2" matrix="[[3,1],[4,1]]"></mutation><field name="ROWS">2</field><field name="COLS">2</field><field name="MATRIX_0_0">3</field><field name="MATRIX_0_1">1</field><field name="MATRIX_1_0">4</field><field name="MATRIX_1_1">1</field></block></value><value name="DIM0"><block type="math_number"><field name="NUM">2</field></block></value><value name="DIM1"><block type="math_number"><field name="NUM">1</field></block></value></block></xml>

文档里的块图都可以用右上角的”复制代码块”按钮复制,再到代码块编辑器里按 Ctrl+V 直接粘贴成真块。想系统练手,跟着用矩阵管理成绩表案例走一遍。


创建矩阵

创建一个指定行列数的矩阵。点击块左上角的蓝色齿轮(变形器)可以增减行列,每个单元格的值直接在格子里填写,初始值默认为 0。

  • 块上先显示行数、再显示列数,”2×3” 就是 2 行 3 列。
  • 单元格里只能填数字。
  • 它是值块(左侧有插头),可以塞进任何接受矩阵的插槽,通常配合”初始化全局变量”存进变量,长期读写。

创建多维矩阵

创建三维及以上的矩阵。用蓝色齿轮增减维度,每个维度的大小分别指定,单元格初始值默认为 0。

  • 取单元格时,给的索引个数必须等于维度数:三维矩阵要给 3 个索引。
  • 典型用途:彩色图片(行 × 列 × 3 个颜色通道)、多个棋盘叠成一层层、”行 × 列”的表格再按班级叠第三维。

获取矩阵单元格

返回矩阵中指定位置的单元格值。矩阵 插槽放矩阵,后面每个维度一个索引插槽(2 维矩阵就是”行索引 + 列索引”)。

  • 返回值是数字。
  • 索引从 1 开始;索引个数必须等于维度数;索引越界会报运行时错误。

设置矩阵单元格

把矩阵中指定位置的值改成新值,直接修改矩阵本身,没有返回值。插槽顺序是:矩阵、值、然后各维索引。

下面的例子把全局变量 棋盘 的第 2 行第 3 列改成 1(比如五子棋在棋盘上落一子):

<xml xmlns="http://www.w3.org/1999/xhtml"><block type="matrices_set_cell" x="20" y="20"><mutation items="2"></mutation><value name="MATRIX"><block type="lexical_variable_get"><field name="VAR">global 棋盘</field></block></value><value name="VALUE"><block type="math_number"><field name="NUM">1</field></block></value><value name="DIM0"><block type="math_number"><field name="NUM">2</field></block></value><value name="DIM1"><block type="math_number"><field name="NUM">3</field></block></value></block></xml>

易错点:

  • 它是语句块(没有返回值),不能塞进值插槽。
  • 索引同样从 1 开始、个数等于维度数。

获取矩阵行

返回矩阵中指定行的整行内容。只能用于 2 维矩阵。

返回的是列表(不是矩阵),所以拿到后可以直接配合列表块使用:求长度、取出某一项、拼进别的列表都行。


获取矩阵列

返回矩阵中指定列的整列内容。只能用于 2 维矩阵。与 获取矩阵行 一样返回列表。

比如成绩表按列取出”数学”这一列的成绩,就是一个可以逐项处理的列表。


获取矩阵维度

以列表形式返回矩阵的维度:2×3 矩阵得到 [2, 3],列表长度就是矩阵的维数。

最常用的招法是配合 从范围循环 遍历整张表:把”获取列表项(维度, 1)”作为循环的终点(行数),内层再嵌一个循环到”获取列表项(维度, 2)”(列数),循环体里用 获取矩阵单元格 逐格处理。完整做法见用矩阵管理成绩表案例。


矩阵加法

返回两个矩阵相加的结果:对应位置的单元格逐一相加。两个矩阵的维度必须完全相同(行数、列数都一样),否则运行时报错。

用蓝色齿轮可以串起多个矩阵,从左到右依次相加。


矩阵减法

返回两个矩阵相减的结果:对应位置的单元格逐一相减。维度必须相同。

注意减法有顺序:A−B 和 B−A 结果不同。


矩阵乘法

返回矩阵相乘的结果。这个块有两种用法,看第二个插槽放什么:

  • 矩阵 × 矩阵:真正的矩阵乘法。要求内维匹配——左矩阵的列数必须等于右矩阵的行数,否则运行时报错。结果的行数取左矩阵、列数取右矩阵:(2×3) × (3×4) 的结果是 2×4。
  • 矩阵 × 数字:数乘,每个单元格都乘上这个数字。比如把一张表格全部打八折,乘 0.8 就行。

矩阵乘法不满足交换律:A×B 和 B×A 一般不相等,串块时顺序不能随手换。

下面的例子把一个 2×2 单位矩阵(乘法里的”1”)与一个 2×3 矩阵的转置相乘——任何矩阵乘单位矩阵都等于它自己,所以结果就是那个 3×2 的转置矩阵。顺带可以看到转置矩阵块可以直接嵌在乘法的插槽里:

<xml xmlns="http://www.w3.org/1999/xhtml"><block type="matrices_multiply" x="20" y="20"><mutation items="2"></mutation><value name="MAT0"><block type="matrices_create"><mutation rows="2" cols="2" matrix="[[1,0],[0,1]]"></mutation><field name="ROWS">2</field><field name="COLS">2</field><field name="MATRIX_0_0">1</field><field name="MATRIX_0_1">0</field><field name="MATRIX_1_0">0</field><field name="MATRIX_1_1">1</field></block></value><value name="MAT1"><block type="matrices_operations"><field name="OP">TRANSPOSE</field><value name="MATRIX"><block type="matrices_create"><mutation rows="2" cols="3" matrix="[[1,2,3],[4,5,6]]"></mutation><field name="ROWS">2</field><field name="COLS">3</field><field name="MATRIX_0_0">1</field><field name="MATRIX_0_1">2</field><field name="MATRIX_0_2">3</field><field name="MATRIX_1_0">4</field><field name="MATRIX_1_1">5</field><field name="MATRIX_1_2">6</field></block></value></block></value></block></xml>

矩阵幂

返回矩阵自乘 n 次的结果,等价于把矩阵乘法串 n 遍。

  • 矩阵必须是方阵(行数 = 列数),否则运行时报错。
  • 指数必须是非负整数;指数为 0 时返回单位矩阵(对角线是 1、其余是 0)。

典型用途:状态转移矩阵连乘(马尔可夫链走 n 步)、图形变换复合。


逆矩阵

返回方阵的逆矩阵:A × A⁻¹ = 单位矩阵。

  • 只能用于方阵;不可逆的矩阵(行列式为 0)运行时报错。
  • 逆矩阵常用来”解方程”:两边同乘逆,就把未知数解出来了。

矩阵的逆、转置、旋转还可以用同一个矩阵操作下拉块完成:拉开下拉列表选择操作即可,与本节独立块等效。


转置矩阵

返回矩阵的转置:行列互换,原来的第 i 行变成新的第 i 列。2×3 的矩阵转置后变成 3×2。只能用于 2 维矩阵。

典型用途:表格”横过来看”——按学生看各科成绩,转置后变成按科目看各学生成绩。


向左旋转矩阵

返回矩阵逆时针旋转 90 度后的结果。旋转后行列数互换(2×3 变 3×2)。只能用于 2 维矩阵。

游戏里方块旋转(如俄罗斯方块)、图片转向,用的就是这个操作。


向右旋转矩阵

返回矩阵顺时针旋转 90 度后的结果。与向左旋转矩阵方向相反,转三次等于对方转一次。只能用于 2 维矩阵。


判断是否为矩阵

如果输入是矩阵返回 真,否则返回 假。

注意:嵌套列表哪怕形状和数字内容都跟矩阵一模一样,也不是矩阵——类型不同。数据来自网络或文件解析(得到列表)时,先用这个块判断一下再当矩阵用。

文档反馈