Matlab数组、向量与矩阵:从核心概念到向量化编程实战

发布时间:2026/8/28 16:49:17

Matlab数组、向量与矩阵:从核心概念到向量化编程实战
1. 从“计算器”到“工具箱”为什么数组、向量和矩阵是Matlab的基石如果你刚开始接触Matlab可能会觉得它像一个功能强大的科学计算器。但用久了你会发现它更像一个为你量身定制的、装满专业工具的车间。在这个车间里数组、向量和矩阵不是枯燥的数学概念而是你手边最趁手的“扳手”和“螺丝刀”。几乎你所有的工作——从处理实验数据、运行仿真模型到绘制专业图表——都始于对这些基本数据结构的熟练操作。很多新手卡在第一步不是因为算法多难而是因为对Matlab处理数据的核心方式不熟悉导致代码冗长、效率低下甚至结果错误。今天我们就抛开那些复杂的理论直接从“怎么用”和“为什么这么用”的角度把这些最基础的“工具”彻底摸透。2. 核心概念拆解标量、数组、向量与矩阵到底是什么关系在Matlab的世界里一切数据本质上都是数组。理解它们之间的层级关系是写出优雅、高效代码的关键。2.1 标量最小的数据单元在Matlab中一个单一的数字如5,3.14,23i就是一个1x1的数组我们称之为标量。你可以把它想象成车间里的一颗独立螺丝。a 10; % 这是一个标量也是一个1x1的双精度浮点数组 whos a % 使用whos命令查看变量信息执行whos a你会看到它的Size是1x1Bytes为8双精度浮点数的典型大小Class是double。这印证了“万物皆数组”的理念。2.2 向量一维的力量向量是只有一行或一列的数组。它分为行向量和列向量这不仅仅是显示的区别在矩阵运算中至关重要。行向量元素水平排列。使用空格或逗号分隔元素。rowVec [1, 2, 3, 4] % 或 [1 2 3 4]列向量元素垂直排列。使用分号分隔元素。colVec [1; 2; 3; 4]为什么区分行列很重要假设你有一组学生的身高数据列向量和一组体重数据列向量。计算内积点积身高 * 体重这里是转置会得到一个标量总和这可能用于计算相关性。而身高 * 体重则会得到一个矩阵外积这通常不是你想要的结果。混淆行列会导致维度不匹配的错误这是最常见的错误之一。2.3 矩阵二维的舞台矩阵是二维数组有明确的行数和列数。它是线性代数运算的核心载体也是图像数据灰度图是二维矩阵彩色图是三维矩阵、表格数据等的自然表示形式。A [1, 2, 3; 4, 5, 6; 7, 8, 9] % 定义一个3行3列的矩阵这个矩阵A在内存中按列优先存储即先存第一列[1;4;7]再存第二列以此类推。这一点在优化循环性能时非常重要按列操作通常更快。2.4 高维数组更广阔的空间当维度超过2我们称之为N维数组。例如一张RGB彩色图片可以用一个高度 x 宽度 x 3的三维数组表示其中第三维的3分别对应红、绿、蓝通道。一组按时间序列的MRI脑部扫描图像则可能是一个高度 x 宽度 x 切片数 x 时间点的四维数组。% 创建一个3x3x2的三维数组可以理解为两页3x3的矩阵 C cat(3, [1 2 3; 4 5 6], [7 8 9; 10 11 12]) % 或者使用更直观的赋值方式 D(:,:,1) [1 2; 3 4]; D(:,:,2) [5 6; 7 8];核心关系总结标量是0维数组的特例向量是1维数组矩阵是2维数组。在Matlab中它们共享同一套操作语法和函数这种一致性极大地降低了学习成本。3. 创建与初始化高效构建你的数据“原料”手动输入小矩阵没问题但处理成百上千的数据时我们必须掌握高效的创建方法。3.1 直接输入与拼接对于小型或规则数据直接输入是最快的。空格或逗号分隔同一行的元素。分号分隔不同的行。方括号[]用于拼接。这是最灵活的方式。% 拼接示例 part1 [1, 2]; part2 [3, 4]; combinedRow [part1, part2] % 水平拼接得到 [1,2,3,4] combinedCol [part1; part2] % 垂直拼接得到 [1,2;3,4]3.2 使用内置函数快速生成这是体现Matlab效率的地方。zeros(m, n)/ones(m, n)/eye(n)生成全零、全一和单位矩阵。初始化变量时常用能避免内存中残留的旧数据干扰。Z zeros(2, 3); % 2行3列零矩阵 I eye(3); % 3阶单位矩阵rand(m, n)/randn(m, n)生成均匀分布和标准正态分布的随机矩阵。用于模拟、测试和初始化权重在机器学习中。linspace(start, end, n)/logspace(start, end, n)生成线性或对数间隔的向量。linspace在创建绘图横坐标时极其常用。x linspace(0, 2*pi, 100); % 在0到2π之间生成100个等间隔点用于绘制光滑的正弦曲线 y sin(x); plot(x, y);:冒号运算符创建等差数列向量的利器。v1 1:5 % 步长为1得到 [1,2,3,4,5] v2 1:2:10 % 步长为2得到 [1,3,5,7,9] v3 10:-1:1 % 步长为-1得到倒序 [10,9,...,1]实操心得linspace控制的是点数:控制的是步长。当你明确需要100个点来画图时用linspace当你需要以固定步长采样时用:。meshgrid与ndgrid生成网格坐标。这是绘制三维曲面图、进行二维插值或计算二元函数值的必备前提。很多新手在这里犯错。[X, Y] meshgrid(1:3, 1:4); % X 是一个矩阵每一行都是 [1,2,3] % Y 是一个矩阵每一列都是 [1;2;3;4] % 这样 (X(i,j), Y(i,j)) 就构成了一个网格点的坐标重要区别meshgrid的设计更符合xy的笛卡尔坐标习惯常用于2D/3D绘图而ndgrid则适用于多维泛化且生成的数组维度更一致。在三维及以上时建议使用ndgrid以避免混乱。3.3 从文件加载真实数据实战中数据常来自文件。load命令是最简单的。.mat文件Matlab原生二进制格式加载最快能保存变量名。save(mydata.mat, A, B); % 保存变量A B到文件 load(mydata.mat); % 加载变量A B直接进入工作区文本/CSV文件使用readmatrix,readtable(推荐) 或旧的csvread。dataTable readtable(sensor_data.csv); % 读取为表格列名自动识别 dataMatrix readmatrix(data.txt); % 读取为数值矩阵注意readtable返回的是table类型它比纯矩阵更能处理混合类型数据数值、字符并且可以通过列名dataTable.ColumnName访问数据代码可读性更高是现代Matlab处理表格数据的首选。4. 索引与切片精准操控数据的“手术刀”索引是Matlab编程的灵魂。强大的索引能力让你无需循环就能操作数据的子集。4.1 基础索引下标、冒号和end单元素索引A(row, col)。记住Matlab索引从1开始冒号索引A(:, col)获取该列所有行A(row, :)获取该行所有列。end关键字表示维度的最后一个索引。A magic(4); % 生成一个4阶魔方阵 lastRow A(end, :); % 最后一行 firstTwoCols A(:, 1:2); % 前两列 centerBlock A(2:3, 2:3); % 中间2x2的子矩阵4.2 线性索引将数组视为一列Matlab在内存中按列存储矩阵。因此你可以用一个数字来索引矩阵这个数字是按列“数下来”的位置。A [1 4; 2 5; 3 6]; % A(1) 1, A(2) 2, A(3) 3, A(4) 4, A(5) 5, A(6) 6 element A(5); % 获取第5个元素即 5find函数返回满足条件的线性索引非常有用。idx find(A 3); % 找到A中所有大于3的元素的线性索引 values A(idx); % 获取这些值4.3 逻辑索引最强大的筛选工具这是我最推荐的高级技巧。使用一个逻辑布尔数组作为索引可以直接选取符合条件的元素。A [1 5; 3 7; 2 6]; logicalMask A 4; % 得到一个同尺寸的逻辑矩阵大于4的位置为true % logicalMask [0,1; 0,1; 0,1] selected A(logicalMask); % 得到 [5;7;6] % 更简洁的写法 selected A(A 4);为什么强大它语法直观A(A0)就是“A中所有大于0的元素”并且避免了显式循环和find的中间步骤通常性能更优。4.4 赋值与删除索引不仅可以读还可以写和删。A(1, :) [10, 20]; % 修改第一行 A(:, [2,4]) []; % 删除第2和第4列赋空值[]即删除 A(A 0) 0; % 将所有负元素置零逻辑索引的经典应用踩坑实录索引赋值时的维度匹配这是一个高频错误。A zeros(3,3); % 错误尝试试图用3个元素的行向量给3个元素的列位置赋值 % A([1,5,9]) [10, 20, 30]; % 如果这样写是可行的因为都是1x3 % 但下面这个更常见 A([1;5;9]) [10; 20; 30]; % 正确两边都是列向量 % 或者 A([1,5,9]) [10, 20, 30]; % 正确两边都是行向量关键在于当你用一组索引线性索引给多个位置赋值时右侧必须是一个与索引数量相同、形状兼容的数组。通常保持右侧为列向量或与索引数组形状一致最安全。5. 核心运算让数据“动”起来Matlab的名字就是“矩阵实验室”其运算设计天然为矩阵服务。5.1 算术运算逐元素与矩阵运算的区分这是新手最大的混淆点。逐元素运算在运算符前加一个点.如.*,./,.^。对应位置的元素单独计算。A [1 2; 3 4]; B [5 6; 7 8]; C_elementwise A .* B; % C [1*5, 2*6; 3*7, 4*8] [5, 12; 21, 32]矩阵运算直接使用*,/,^。遵循线性代数规则。% 矩阵乘法 A * BA的列数必须等于B的行数 C_matrix A * B; % C [1*52*7, 1*62*8; 3*54*7, 3*64*8] [19, 22; 43, 50] % 矩阵乘方 A^2 等价于 A * A重要提醒当你想要对每个元素做平方、求倒数时一定要用.^2和./。误用矩阵运算会导致维度错误或完全错误的结果。5.2 转置与共轭转置.普通转置行列互换。共轭转置Hermitian转置对于实数矩阵两者相同对于复数矩阵还会取每个元素的复共轭。R [1 2; 3 4]; R_transpose R.; % [1 3; 2 4] C [12i, 3-4i]; C_transpose C.; % [12i; 3-4i] C_hermitian C; % [1-2i; 34i] (取了共轭)在涉及复数运算的内积x * y时使用是正确的因为它包含了共轭符合内积定义。5.3 常用矩阵函数size(A)/length(v)/numel(A)获取维度信息。numel返回元素总数在不知道维度时用于循环上限很安全。reshape(A, m, n)改变矩阵形状不改变元素顺序按列重排。元素总数必须一致。v 1:6; M reshape(v, 2, 3); % M [1 3 5; 2 4 6]repmat(A, m, n)/repelem(A, m, n)平铺和重复元素。repmat复制整个矩阵块repelem重复每个元素。inv(A)/pinv(A)矩阵逆和伪逆。慎用inv对于求解线性方程组A*x b应使用x A \ b反斜杠运算符它更稳定、更快会自动根据矩阵情况选择最优算法如LU分解、Cholesky分解等。inv主要用于理论推导或需要显式逆矩阵的少数情况。det(A)/rank(A)/trace(A)行列式、秩、迹。[V, D] eig(A)特征值和特征向量。eigs用于稀疏矩阵或求最大/最小的几个特征值。sum(A)/mean(A)/std(A)/max(A)/min(A)统计函数。默认按列操作返回行向量。如果想对所有元素操作可以sum(A, ‘all’)新版Matlab或sum(A(:))。6. 实战进阶向量化编程与性能提升Matlab是解释型语言循环特别是多层循环很慢。向量化编程是写出高性能Matlab代码的不二法门。其核心思想是利用数组的整体运算代替对单个元素的循环操作。6.1 一个经典例子计算两点间距离矩阵假设有两组点P1(m个点) 和P2(n个点)我们要计算所有点对之间的欧氏距离得到一个m x n的距离矩阵D。低效的循环写法m size(P1, 1); n size(P2, 1); D zeros(m, n); for i 1:m for j 1:n D(i, j) sqrt(sum((P1(i,:) - P2(j,:)).^2)); end end高效的向量化写法利用广播机制% 假设 P1 是 m x d 矩阵 P2 是 n x d 矩阵 (d是维度比如2或3) % 利用 reshape 和 permute 进行维度扩展实现广播计算 % 方法1使用 pdist2 函数Statistics and Machine Learning Toolbox % D pdist2(P1, P2); % 最简单但需要工具箱 % 方法2手动向量化 (通用方法) % 计算 (x_i - y_j)^2 x_i^2 y_j^2 - 2*x_i*y_j % 这里利用矩阵乘法一次性计算所有点对的点积 P1_sq sum(P1.^2, 2); % m x 1, 每行的平方和 P2_sq sum(P2.^2, 2); % 1 x n, 每行的平方和转置为行向量 P1_P2 P1 * P2; % m x n, 所有点对的点积 D sqrt(P1_sq P2_sq - 2 * P1_P2); % m x n向量化版本避免了双重循环利用了高度优化的矩阵乘法BLAS库速度可能提升数十甚至上百倍。6.2 广播机制详解从R2016b开始Matlab引入了隐式扩展广播这进一步简化了向量化。对于维度兼容的数组Matlab会自动将维度为1的维度扩展以匹配另一个数组的对应维度。A [1 2 3; 4 5 6]; % 2x3 v [10; 20]; % 2x1 % 旧版本需要 bsxfun(plus, A, v) C A v; % v被自动扩展为 [10 10 10; 20 20 20]然后与A相加广播规则从尾部维度开始比对每个维度必须相等或其中之一为1。(2x3)和(2x1)比对第二维3和1中1可以扩展为3第一维2和2相等。因此兼容。6.3 逻辑索引与向量化的结合逻辑索引本身就是向量化的体现。% 任务将矩阵中所有大于均值的元素替换为均值 A randn(1000); % 1000x1000随机矩阵 meanValue mean(A, ‘all’); % 计算整体均值 A(A meanValue) meanValue; % 一行代码完成无需循环性能对比心得在可能的情况下优先使用内置函数和向量化操作。使用profile命令查看代码各部分的耗时你会发现循环往往是瓶颈。对于确实无法向量化的复杂逐元素操作可以考虑将其用C/C编写为MEX文件或者使用arrayfun、cellfun但通常仍不如纯向量化快。7. 内存管理与调试技巧写出稳健的代码7.1 预分配内存在循环中增长数组例如result [result; newValue]是性能杀手因为Matlab每次都需要寻找新的连续内存块并复制旧数据。务必预分配。n 10000; % 糟糕的做法 result []; for i 1:n result(i) someCalculation(i); % 每次循环都在改变result的大小 end % 正确的做法 result zeros(1, n); % 预分配一个足够大的数组 for i 1:n result(i) someCalculation(i); end7.2 利用whos和clear管理工作区whos查看当前工作区所有变量的名称、大小、内存占用和类型。定期查看有助于发现意外产生的大型临时变量。clear清除变量。clear all清除所有clear var1 var2清除指定变量。在脚本开头使用clear; close all; clc;是个好习惯确保干净的环境。7.3 常见错误与调试“索引超出矩阵维度”检查你的索引值是否超过了size(A)返回的范围。循环变量是否写错end关键字用对了吗“矩阵维度必须一致”检查逐元素运算.*,./的两个操作数是否尺寸完全相同或者满足广播规则。“函数或变量未定义”检查拼写检查文件是否在Matlab路径中。对于像deltalin这样的错误很可能是工具箱未安装或函数名拼写错误。使用调试器在编辑器行号旁点击设置断点红点按F5运行程序会在断点处暂停。此时可以查看工作区变量按F10单步执行按F11进入函数这是定位逻辑错误最有效的方法。7.4 代码风格建议变量名使用有意义的名称如studentGrades而非sg。避免使用i和j作为循环变量它们是虚数单位可以用ii,jj。注释用%注释复杂逻辑的目的。区块注释可以用%%单元格模式便于分块运行和生成报告。向量化时刻思考“能否不用循环”。函数化将重复使用的代码块封装成函数输入输出明确便于测试和复用。掌握数组、向量和矩阵你就握住了打开Matlab强大功能大门的钥匙。这些基础概念贯穿始终无论是后续学习数值计算、图像处理、信号分析还是机器学习都离不开对它们的灵活运用。我个人的体会是多写、多试、多向量化遇到错误耐心查看文档和调试把这些基础工具用熟了后面学习更高级的内容会顺畅得多。下次我们可以聊聊如何在Matlab中高效地处理和分析这些数据比如数据筛选、排序、查找以及简单的统计可视化。

相关新闻

Matlab实现M/M/c排队系统仿真:从数学建模到性能优化实战

Matlab实现M/M/c排队系统仿真:从数学建模到性能优化实战

2026/8/28 16:39:17

1. 项目概述:排队系统仿真的核心价值 排队,这个现象几乎渗透在我们生活的每一个角落。从超市收银台前的长龙,到银行窗口前的等待,再到网络服务器处理请求的队列,本质上都是“顾客”在等待“服务台”提供服务。作为一名…

django-tasks 完整指南:Django 后台任务框架从入门到落地

django-tasks 完整指南:Django 后台任务框架从入门到落地

2026/8/28 16:39:17

django-tasks 完整指南:Django 后台任务框架从入门到落地 【免费下载链接】django-tasks A backport of Djangos built in Tasks framework 项目地址: https://gitcode.com/gh_mirrors/dj/django-tasks 在 Web 请求里同步跑一个耗时任务,页面就会…

MiniMax-H3 Turbo LoRA 显存优化指南:4 步采样,有限显存也能跑出带声音的视频

MiniMax-H3 Turbo LoRA 显存优化指南:4 步采样,有限显存也能跑出带声音的视频

2026/8/28 16:39:17

MiniMax-H3 Turbo LoRA 显存优化指南:4 步采样,有限显存也能跑出带声音的视频 【免费下载链接】MiniMax-H3-Turbo-Lora 项目地址: https://ai.gitcode.com/hf_mirrors/larryvrh/MiniMax-H3-Turbo-Lora MiniMax-H3 Turbo LoRA 让约 33B 的 MiniMa…

快手PlatformBid:广告竞价机制从单广告主最优到全局共赢

快手PlatformBid:广告竞价机制从单广告主最优到全局共赢

2026/8/28 17:49:23

KDD 2026|快手 PlatformBid:从单广告主最优到平台全局共赢这次我们来看一个广告竞价机制方向的新工作:快手在 KDD 2026 上的 PlatformBid。名字已经说得很直白——把视角从“单个广告主如何优化自己的出价”切换到“平台如何设计竞价机制&…

面向具身智能的TVA-World多智能体协同新范式

面向具身智能的TVA-World多智能体协同新范式

2026/8/28 17:49:23

前沿技术探索:TVA智能体(简称TVA)TVA智能体(亦称“AI智能体视觉”或“TVA视觉智能体”)是依托Transformer架构与“因式智能体”理论构建的通用视觉技术体系。它有机融合深度强化学习(DRL)、卷积…

Transformer驱动的3D场景生成:从稀疏照片到可探索空间

Transformer驱动的3D场景生成:从稀疏照片到可探索空间

2026/8/28 17:49:23

有没有想过,未来搭建一个 3D 场景,可能不再需要专业的建模师、扫描仪和漫长的渲染流程?只需要一部普通手机,绕着房间走动拍几张照片,然后等上几秒钟,就能得到一个可以自由旋转、行走、预览的 3D 空间。这个…

publishready MCP 服务说明文档

publishready MCP 服务说明文档

2026/8/28 17:49:23

1. 服务概述一句话简介:确定性写作分析系统,将AI草稿转化为可发布的写作内容,作为AI生成文本的最终QA检查服务名称:publishready版本号:最新版本开发者/提供方:veldica协议类型:MCP (Model Cont…

PRISM:多变量时间序列转图像表示与异常检测

PRISM:多变量时间序列转图像表示与异常检测

2026/8/28 17:49:23

这次我们来看一个面向多变量时间序列异常检测的表示学习方法:PRISM。项目全称是PRISM: Powerful Time Series to Image (TS2I) Representations for Multivariate Anomaly Detection,核心思路一句话能说清:把多变量时间序列转换成图像&#x…

自托管沙箱工作区:为AI Agent构建可回滚的安全自修改环境

自托管沙箱工作区:为AI Agent构建可回滚的安全自修改环境

2026/8/28 17:39:23

遇到 AI Agent 需要动手改代码、写配置、生成中间文件,又不能让它直接碰宿主机全部文件的时候,一个 self-hosted 、 sandboxed 、 self-modifying 的工作区就成了刚需。XBin 正是这类开源项目中的一种实现:它把一个可以自我修改内容的工…

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

2026/8/27 11:10:02

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

2026/8/27 7:25:23

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

2026/8/28 7:34:42

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

基于Claude Code的开源AI求职框架:从职位搜索到Offer的全自动化闭环

基于Claude Code的开源AI求职框架:从职位搜索到Offer的全自动化闭环

2026/8/28 0:08:32

当AI助手能够独立完成从职位匹配、简历定制到面试准备的全链路求职流程时,求职不再是一场信息战,而是一场工程化战役。框架概述:本地运行的AI求职引擎这是一个构建在Claude Code之上的开源AI求职框架,核心理念是"在工作者的机…

Godot 4 仿 agar.io:相机缩放被 max_zoom 卡死,窗口越大球越小的根因与修复

Godot 4 仿 agar.io:相机缩放被 max_zoom 卡死,窗口越大球越小的根因与修复

2026/8/28 0:08:32

1. 问题现象 在 Godot 4 仿 agar.io 的 2D 项目中,相机缩放设计为「由球组整体尺寸决定」,世界可见高度恒定,窗口只作为视口裁剪。默认小窗口 1280x720 时相机高度正常;但窗口最大化到 2940x1912 后,视角被明显拉远、…

从软件测试大赛到实战:Java+Selenium自动化测试进阶指南

从软件测试大赛到实战:Java+Selenium自动化测试进阶指南

2026/8/28 0:08:32

1. 缘起:从校园到赛场,我的软件测试之路几年前,我还是一个在校园里对着Java课本和“Hello World”程序挠头的普通学生。软件测试对我来说,只是一个在开发流程末尾、用鼠标点点按钮的模糊概念。直到我偶然在学校的公告栏上看到了“…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/28 7:35:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/28 7:34:51

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/28 7:34:35

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…