线性代数:Matrix2x2和Matrix3x3
今天整理自己的框架代码,将Matrix2x2和Matrix3x3给扩展了一下,发现网上unity数学计算相关挺少的,所以记录一下。
首先扩展Matrix2x2:
using System.Collections;
using System.Collections.Generic;
using Unity.Mathematics;
using UnityEngine;public class Matrix2x2
{#region ///propertiespublic const int ROW = 2;public const int COLUMN = 2;public float M00{get { return dataArr[0, 0]; }set { dataArr[0, 0] = value; }}public float M01{get { return dataArr[0, 1]; }set { dataArr[0, 1] = value; }}public float M10{get { return dataArr[1, 0]; }set { dataArr[1, 0] = value; }}public float M11{get { return dataArr[1, 1]; }set { dataArr[1, 1] = value; }}private float[,] dataArr = new float[ROW, COLUMN];public Vector2 Row0 { get { return new Vector2(M00, M01); } }public Vector2 Row1 { get { return new Vector2(M10, M11); } }public Vector2 Column0 { get { return new Vector2(M00, M10); } }public Vector2 Column1 { get { return new Vector2(M01, M11); } }#endregionpublic float this[int row, int col]{get { return dataArr[row, col]; }set { dataArr[row, col] = value; }}public Matrix2x2() { }public Matrix2x2(float m00, float m01, float m10, float m11){M00 = m00;M01 = m01;M10 = m10;M11 = m11;}/// <summary>/// xy基向量/// 竖向排列/// </summary>/// <param name="ax"></param>/// <param name="ay"></param>public Matrix2x2(Vector2 ax, Vector2 ay){M00 = ax.x;M10 = ax.y;M10 = ay.x;M11 = ay.y;}/// <summary>/// 2*2数组/// </summary>/// <param name="arr"></param>public Matrix2x2(float[,] arr){M00 = arr[0, 0];M01 = arr[0, 1];M10 = arr[1, 0];M11 = arr[1, 1];}/// <summary>/// 矩阵*vector2/// </summary>/// <param name="m2x2"></param>/// <param name="v2"></param>/// <returns></returns>public static Vector2 operator *(Matrix2x2 m2x2, Vector2 v2){float x = Vector2.Dot(m2x2.Row0, v2);float y = Vector2.Dot(m2x2.Row1, v2);return new Vector2(x, y);}/// <summary>/// 矩阵*矩阵/// </summary>/// <param name="m2x2a"></param>/// <param name="m2x2b"></param>/// <returns></returns>public static Matrix2x2 operator *(Matrix2x2 m2x2a, Matrix2x2 m2x2b){float c00 = Vector2.Dot(m2x2a.Row0, m2x2b.Column0);float c01 = Vector2.Dot(m2x2a.Row0, m2x2b.Column1);float c10 = Vector2.Dot(m2x2a.Row1, m2x2b.Column0);float c11 = Vector2.Dot(m2x2a.Row1, m2x2b.Column1);Matrix2x2 ret = new Matrix2x2(c00, c01, c10, c11);return ret;}/// <summary>/// 矩阵/标量/// </summary>/// <param name="m2x2"></param>/// <param name="f"></param>/// <returns></returns>public static Matrix2x2 operator /(Matrix2x2 m2x2, float f){for (int x = 0; x < ROW; x++){for (int y = 0; y < COLUMN; y++){m2x2[x, y] /= f;}}return m2x2;}/// <summary>/// 行列式/// </summary>/// <returns></returns>public float GetDeterminant(){float det = M00 * M11 - M01 * M10;return det;}/// <summary>/// 求转置矩阵/// </summary>/// <returns></returns>public Matrix2x2 GetTransposeMatrix(){Matrix2x2 m2x2T = new Matrix2x2();for (int x = 0; x < ROW; x++){for (int y = 0; y < COLUMN; y++){m2x2T[x, y] = this[y, x];}}return m2x2T;}/// <summary>/// 求余子式标量/// </summary>/// <param name="r"></param>/// <param name="c"></param>/// <returns></returns>public float GetCofactorScalar(int r, int c){float cof = 0f;for (int x = 0; x < ROW; x++){for (int y = 0; y < COLUMN; y++){if (x != r && y != c){cof = dataArr[x, y];break;}}}return cof;}/// <summary>/// 求余子式标量矩阵/// + -/// - +/// </summary>/// <returns></returns>public Matrix2x2 GetCofactorScalarMatrix(){Matrix2x2 m2x2 = new Matrix2x2();for (int x = 0; x < ROW; x++){for (int y = 0; y < COLUMN; y++){float cof = GetCofactorScalar(x, y);bool ispostive = (x + y) % 2 == 0;m2x2[x, y] = ispostive ? cof : -cof;}}return m2x2;}/// <summary>/// 求伴随矩阵/// 算法:余子式标量矩阵的转置/// </summary>/// <returns></returns>public Matrix2x2 GetAdjointMatrix(){Matrix2x2 m2x2 = GetCofactorScalarMatrix();Matrix2x2 m2x2T = m2x2.GetTransposeMatrix();return m2x2T;}/// <summary>/// 求逆矩阵/// 算法:伴随矩阵/行列式值/// </summary>/// <returns></returns>public Matrix2x2 GetInverseMatrix(){Matrix2x2 m2x2 = GetAdjointMatrix();float det = GetDeterminant();Matrix2x2 m2x2I = m2x2 / det;return m2x2I;}public override string ToString(){string ret = $"换行\nM00:{M00} M01:{M01} \nM10:{M10} M11:{M11}";return ret;}
}
关于Matrix2x2,我设计了构造、转置、余子式(2x2矩阵的余子式为标量,或称1x1矩阵)、余子式标量矩阵、伴随矩阵和逆矩阵。
基本上数学运算开发够用了,每个函数的意义只在代码注释上简单说明。
这里只举一个例子:逆矩阵可以将矩阵变换后向量再变换回来,比如:
Matrix2x2 m2x2 = new Matrix2x2();
m2x2.M00 = 0.3f;
m2x2.M01 = 1.2f;
m2x2.M10 = 5.2f;
m2x2.M11 = -1f;Debug.LogErrorFormat($"m2x2 = {m2x2}");Vector2 vec0 = new Vector2(5.8f, 56.1f);Vector2 vec1 = m2x2 * vec0;Matrix2x2 m2x2I = m2x2.GetInverseMatrix();Debug.LogErrorFormat($"m2x2I = {m2x2I}");Vector2 vec2 = m2x2I * vec1;Debug.LogErrorFormat($"vec0 = {vec0} vec1 = {vec1} vec2 = {vec2}");
结果:

接下来扩展Matrix3x3:
using NPOI.SS.Formula.Functions;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;[System.Serializable]
public class Matrix3x3
{#region ///propertiespublic const int ROW = 3;public const int COLUMN = 3;public float M00{get { return dataArr[0, 0]; }set { dataArr[0, 0] = value; }}public float M01{get { return dataArr[0, 1]; }set { dataArr[0, 1] = value; }}public float M02{get { return dataArr[0, 2]; }set { dataArr[0, 2] = value; }}public float M10{get { return dataArr[1, 0]; }set { dataArr[1, 0] = value; }}public float M11{get { return dataArr[1, 1]; }set { dataArr[1, 1] = value; }}public float M12{get { return dataArr[1, 2]; }set { dataArr[1, 2] = value; }}public float M20{get { return dataArr[2, 0]; }set { dataArr[2, 0] = value; }}public float M21{get { return dataArr[2, 1]; }set { dataArr[2, 1] = value; }}public float M22{get { return dataArr[2, 2]; }set { dataArr[2, 2] = value; }}public float[,] dataArr = new float[ROW, COLUMN];public Vector3 Row0 { get { return new Vector3(M00, M01, M02); } }public Vector3 Row1 { get { return new Vector3(M10, M11, M12); } }public Vector3 Row2 { get { return new Vector3(M20, M21, M22); } }public Vector3 Column0 { get { return new Vector3(M00, M10, M20); } }public Vector3 Column1 { get { return new Vector3(M01, M11, M21); } }public Vector3 Column2 { get { return new Vector3(M02, M12, M22); } }#endregionpublic float this[int row, int col]{get { return dataArr[row, col]; }set { dataArr[row, col] = value; }}public Matrix3x3() { }public Matrix3x3(float m00, float m01, float m02, float m10, float m11, float m12, float m20, float m21, float m22){M00 = m00;M01 = m01;M02 = m02;M10 = m10;M11 = m11;M12 = m12;M20 = m20;M21 = m21;M22 = m22;}/// <summary>/// xyz基向量排列/// </summary>/// <param name="ax">x基向量</param>/// <param name="ay">y基向量</param>/// <param name="az">z基向量</param>public Matrix3x3(Vector3 ax, Vector3 ay, Vector3 az){M00 = ax.x;M10 = ax.y;M20 = ax.z;M01 = ay.x;M11 = ay.y;M21 = ay.z;M02 = az.x;M12 = az.y;M22 = az.z;}/// <summary>/// 数组排列/// </summary>/// <param name="arr"></param>public Matrix3x3(float[,] arr){M00 = arr[0, 0];M01 = arr[0, 1];M02 = arr[0, 2];M10 = arr[1, 0];M11 = arr[1, 1];M12 = arr[1, 2];M20 = arr[2, 0];M21 = arr[2, 1];M22 = arr[2, 2];}/// <summary>/// 矩阵*vector2/// </summary>/// <param name="m3x3"></param>/// <param name="v2"></param>/// <returns></returns>public static Vector2 operator *(Matrix3x3 m3x3, Vector2 v2){Vector3 v3 = new Vector3(v2.x, v2.y, 1);v3 = m3x3 * v3;v2 = new Vector2(v3.x, v3.y);return v2;}/// <summary>/// 矩阵*vector3/// </summary>/// <param name="m3x3"></param>/// <param name="v3"></param>/// <returns></returns>public static Vector3 operator *(Matrix3x3 m3x3, Vector3 v3){float x = Vector3.Dot(m3x3.Row0, v3);float y = Vector3.Dot(m3x3.Row1, v3);float z = Vector3.Dot(m3x3.Row2, v3);return new Vector3(x, y, z);}/// <summary>/// 矩阵*矩阵/// </summary>/// <param name="m3x3a"></param>/// <param name="m3x3b"></param>/// <returns></returns>public static Matrix3x3 operator *(Matrix3x3 m3x3a, Matrix3x3 m3x3b){float c00 = Vector2.Dot(m3x3a.Row0, m3x3b.Column0);float c01 = Vector2.Dot(m3x3a.Row0, m3x3b.Column1);float c02 = Vector2.Dot(m3x3a.Row0, m3x3b.Column2);float c10 = Vector2.Dot(m3x3a.Row1, m3x3b.Column0);float c11 = Vector2.Dot(m3x3a.Row1, m3x3b.Column1);float c12 = Vector2.Dot(m3x3a.Row1, m3x3b.Column2);float c20 = Vector2.Dot(m3x3a.Row2, m3x3b.Column0);float c21 = Vector2.Dot(m3x3a.Row2, m3x3b.Column1);float c22 = Vector2.Dot(m3x3a.Row2, m3x3b.Column2);Matrix3x3 ret = new Matrix3x3(c00, c01, c02, c10, c11, c12, c20, c21, c22);return ret;}/// <summary>/// 矩阵/标量/// </summary>/// <param name="m3x3"></param>/// <param name="f"></param>/// <returns></returns>public static Matrix3x3 operator /(Matrix3x3 m3x3, float f){for (int x = 0; x < ROW; x++){for (int y = 0; y < COLUMN; y++){m3x3[x, y] /= f;}}return m3x3;}/// <summary>/// 求行列式/// </summary>/// <returns></returns>public float GetDeterminant(){float det = M00 * M11 * M22 + M01 * M12 * M20 + M02 * M10 * M21 - M02 * M11 * M20 - M01 * M10 * M22 - M00 * M12 * M21;return det;}/// <summary>/// 求转置矩阵/// </summary>/// <returns></returns>public Matrix3x3 GetTransposeMatrix(){Matrix3x3 m3x3T = new Matrix3x3();for (int x = 0; x < ROW; x++){for (int y = 0; y < COLUMN; y++){m3x3T[x, y] = this[y, x];}}return m3x3T;}/// <summary>/// 求余子式矩阵/// </summary>/// <param name="r"></param>/// <param name="c"></param>/// <returns></returns>public Matrix2x2 GetCofactorMatrix(int r, int c){Matrix2x2 m2x2 = new Matrix2x2();for (int x = 0; x < ROW; x++){for (int y = 0; y < COLUMN; y++){if (x != r && y != c){int row = x > r ? x - 1 : x;int col = y > c ? y - 1 : y;m2x2[row, col] = this[x, y];}}}return m2x2;}/// <summary>/// 求代数余子式(余子式矩阵的行列式)矩阵/// 余子式矩阵行列式正负号/// + - +/// - + -/// + - +/// </summary>/// <returns></returns>public Matrix3x3 GetCofactorDeterminantMatrix(){Matrix3x3 m3x3 = new Matrix3x3();for (int x = 0; x < ROW; x++){for (int y = 0; y < COLUMN; y++){Matrix2x2 m2x2 = GetCofactorMatrix(x, y);float m2x2det = m2x2.GetDeterminant();bool ispostive = (x + y) % 2 == 0;m3x3[x, y] = ispostive ? m2x2det : -m2x2det;}}return m3x3;}/// <summary>/// 求伴随矩阵/// 算法:代数余子式矩阵的转置/// </summary>/// <returns></returns>public Matrix3x3 GetAdjointMatrix(){Matrix3x3 m3x3 = GetCofactorDeterminantMatrix();Matrix3x3 m3x3T = m3x3.GetTransposeMatrix();return m3x3T;}/// <summary>/// 求逆矩阵/// 算法:伴随矩阵/行列式值/// </summary>/// <returns></returns>public Matrix3x3 GetInverseMatrix(){Matrix3x3 m3x3 = GetAdjointMatrix();float det = GetDeterminant();Matrix3x3 m3x3I = m3x3 / det;return m3x3I;}public override string ToString(){string ret = $"换行\nM00:{M00} M01:{M01} M02:{M02} \nM10:{M10} M11:{M11} M12:{M12} \nM20:{M20} M21:{M21} M12:{M22}";return ret;}
}
还是用逆矩阵验证一下:
Matrix3x3 m3x3 = new Matrix3x3();
m3x3.M00 = -0.3f;
m3x3.M01 = 6.2f;
m3x3.M02 = 12.6f;
m3x3.M10 = 5.2f;
m3x3.M11 = -1.8f;
m3x3.M12 = 7.8f;
m3x3.M20 = -52.2f;
m3x3.M21 = 6.4f;
m3x3.M22 = -70.1f;Debug.LogErrorFormat($"m3x3 = {m3x3}");Vector3 vec0 = new Vector3(20.3f, -54f, 4.4f);Vector3 vec1 = m3x3 * vec0;Matrix3x3 m3x3I = m3x3.GetInverseMatrix();Debug.LogErrorFormat($"m3x3I = {m3x3I}");Vector3 vec2 = m3x3I * vec1;Debug.LogErrorFormat($"vec0 = {vec0} vec1 = {vec1} vec2 = {vec2}");
结果:

OK,洗了睡,这里吐槽一下:这些矩阵计算unity应该直接提供,写起来眼睛都要看瞎了。
相关文章:
线性代数:Matrix2x2和Matrix3x3
今天整理自己的框架代码,将Matrix2x2和Matrix3x3给扩展了一下,发现网上unity数学计算相关挺少的,所以记录一下。 首先扩展Matrix2x2: using System.Collections; using System.Collections.Generic; using Unity.Mathemati…...
Windows 中 Electron 项目实现运行时权限提升以杀掉特定进程
#Windows 中 Electron 项目实现运行时权限提升以杀掉特定进程 一、引言 在 Windows 操作系统中,有时我们需要以管理员权限来执行某些操作,特别是当需要杀掉由管理员启动的进程时。Electron 是一个开源的框架,用于使用 JavaScript、HTML 和 C…...
赠你一只金色的眼 - 富集分析和表达数据可视化
GOplot包介绍 GOplot包用于生物数据的可视化。更确切地说,该包将表达数据与功能分析的结果整合并进行可视化。但是要注意该包不能用于执行这些分析,只能把分析结果进行可视化。在所有科学领域,由于空间限制和结果所需的简洁性,切…...
鸿蒙的进击之路
1. 题记: 为什么要写鸿蒙,因为她是华为的,为什么是华为就要写,因为华为背负了国人太多太多的包袱,或点赞或抨击。 我是强烈支持华为的,但我会客观公正地去评价华为的产品,就比如这篇博文&#…...
c语言中的线程管理pthread详解
在C语言中,多线程编程常用的POSIX线程(POSIX Threads, pthreads)库主要由pthread.h头文件提供。pthread.h定义了许多用于线程创建、管理、同步的函数和数据结构。下面是pthread.h中的核心概念和主要函数的详细介绍。 1. 基本概念 线程:线程是一个轻量级的进程,可以并发执…...
关于qiskit版本>1.0.0,execute函数被替换
关于下列代码,当qiskit版本大于1时,无法使用execute函数,定义transpiled_circuit和run函数来替换。 import numpy as np from qiskit import QuantumCircuit, Aer, executedef calculate_hydrogen_energy():# Definir el circuito cunticoci…...
给 Docker 配置网络代理
参考 https://www.cnblogs.com/Chary/p/18096678如何优雅的给 Docker 配置网络代理 有时因为网络原因,比如公司 NAT,或其它啥的,需要使用代理。Docker 的代理配置,略显复杂,因为有三种场景。但基本原理都是一致的,都是利用 Linux 的 http_proxy 等环境变量。 Dockerd 代…...
软件测试基础十七(python Unittest)
Unittest 一、Unittest 简介 unittest是 Python 内置的标准测试框架,用于编写和运行单元测试。它提供了一组工具和类,帮助开发者组织、编写和执行测试用例,以验证代码的正确性。 二、Unittest 核心要素 1. TestCase(测试用例类…...
技术领导者的道与术:从领导者到领导力
目录标题 领导者现实看起来是这样技术领导者不应该和个人坐在一起技术领导力仍然是必须的从技术领导到技术领导力小结领导者 你可能想成为或者已经是一位技术领导者,估计你现在心里想成为超级英雄的想法正在爆棚。 你是Java、JavaScript、Angular等技术的专家,公司的项目代…...
Starrocks Compaction的分析
背景 本文基于 Starrocks 3.1.7 结论 Starrocks 会启动一个线程周期性的去进行Compaction,该周期间隔为 200 MS, 该Compaction以table的partition为切入点,tablet(也就是bucket)为粒度进行task的创建。 分析 CompactionMgr start 方法会启动一个Com…...
淘淘商城实战高并发分布式项目(有源码)
通过百度网盘分享的文件:淘淘商城实战高并发分布式项目(有源码) 链接:https://pan.baidu.com/s/1V94gRALxHgMVwpcXoE-miA?pwdglu7 提取码:glu7 在互联网技术飞速发展的当下,高并发分布式项目成为了众多电商平台等大型应用的核心…...
内网部署web项目,外网访问不了?只有局域网能访问!怎样解决?
相关技术 要实现“内网部署,外网访问”,可以使用内网穿透、VPN技术、DMZ主机、端口映射等方法。以下是对这些方法的详细解释: 一、内网穿透 内网穿透是一种技术,它通过将内网设备映射到公网上的方式,实现外网访问内…...
Jenkins系列
jenkins 1、搭建Jenkins 搭建Jenkins 2、这是什么 3、这是什么 4、 这是什么 5、这是什么 文章目录 jenkins1、搭建Jenkins2、这是什么3、这是什么4、 这是什么5、这是什么 前言 前言 提示:这里可以添加本文要记录的大概内容: 例如:随…...
技术总结(二十四)
一、Redis 分布式锁的常见使用场景有哪些? 资源竞争控制 数据库事务控制:在分布式系统中,多个服务可能会同时对数据库中的同一行数据进行操作。例如,在一个电商系统里,多个订单处理服务可能会同时尝试更新同一个订单的…...
原生鸿蒙应用市场:赋能开发者全生命周期服务体验
文章目录 背景自动化检测前移:早发现,早解决技术细节:静态代码分析与兼容性测试应用场景 按需加载:优化性能,提升用户体验技术细节:模块化与懒加载实现应用场景 应用加密:保护应用代码安全&…...
深入解析TOML、XML、YAML和JSON:优劣对比与场景应用
摘要:本文将介绍四种常见的配置文件和数据交换格式:TOML、XML、YAML和JSON,通过具体的使用例子分析它们的优缺点,并探讨在不同场景下的应用选择。 正文: 一、TOML 优点: 易于阅读和编写:TOML的…...
前端UniApp面试题及参考答案(100道题)
目录 UniApp 支持哪些平台? UniApp 在不同平台上的表现有何差异? 如何处理 UniApp 中的平台差异? UniApp 项目创建与目录结构 项目创建 目录结构 如何创建一个 UniApp 项目? UniApp 项目的基本目录结构是什么样的? 解释一下 UniApp 中的页面生命周期钩子函数有哪…...
MoonBit 双周报 Vol.59:新增编译器常量支持,改进未使用警告,支持跨包函数导入...多个关键技术持续优化中!
2024-11-04 MoonBit更新 增加了编译期常量的支持。常量的名字以大写字母开头,用语法 const C ... 声明。常量的类型必须是内建的数字类型或 String。常量可以当作普通的值使用,也可以用于模式匹配。常量的值目前只能是字面量: const MIN_…...
Linux相关概念和易错知识点(20)(dentry、分区、挂载)
目录 1.dentry (1)路径缓存的原因 (2)dentry的结构 ①多叉树结构 ②file和dentry之间的联系 ③路径概念存在的意义 2.分区 (1)为什么要确认分区 (2)挂载 ①进入分区 ②被挂…...
论 ONLYOFFICE:开源办公套件的深度探索
公主请阅 引言第一部分:ONLYOFFICE 的历史背景1.1 开源软件的崛起1.2 ONLYOFFICE 的发展历程 第二部分:ONLYOFFICE 的核心功能2.1 文档处理2.2 电子表格2.3 演示文稿 第三部分:技术架构与兼容性3.1 技术架构3.2 兼容性 第四部分:部…...
PDF-Guru安全防护指南:从威胁识别到主动防御
PDF-Guru安全防护指南:从威胁识别到主动防御 【免费下载链接】PDF-Guru A Multi-purpose PDF file processing tool with a nice UI that supports merge, split, rotate, reorder, delete, scale, crop, watermark, encrypt/decrypt, bookmark, extract, compress,…...
OpenClaw+GLM-4.7-Flash:自动化代码审查工具
OpenClawGLM-4.7-Flash:自动化代码审查工具 1. 为什么需要自动化代码审查 作为一个长期与代码打交道的开发者,我深知代码审查的重要性。但现实情况是,团队中的代码审查往往成为瓶颈——要么因为人力不足导致积压,要么因为审查者…...
手把手教你用GD32F30x的定时器搞定BLDC电机霍尔信号捕获(附完整代码)
手把手教你用GD32F30x的定时器实现BLDC电机霍尔信号精准捕获 当你的GD32F30x开发板已经连接好BLDC电机的霍尔传感器,却发现转速计算总是不准确时,问题往往出在定时器的配置细节上。本文将带你从寄存器层面拆解霍尔信号捕获的全流程,解决实际开…...
从素材到成片:AI 一站式极速输出——影视创作的新时代革命
在数字化浪潮席卷全球的今天,影视创作领域正经历着前所未有的变革。传统影视制作流程繁琐复杂,从素材采集、剪辑、特效添加到成片输出,往往需要耗费大量的人力、物力和时间。然而,随着人工智能(AI)技术的飞…...
突破式3步实现:用MOOTDX构建零成本金融数据获取引擎
突破式3步实现:用MOOTDX构建零成本金融数据获取引擎 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx 在金融数据分析领域,数据获取一直是从业者面临的核心挑战。无论是量化交…...
完整指南:为什么选择WeChatMsg开源工具解决你的微信聊天记录备份与分析难题
完整指南:为什么选择WeChatMsg开源工具解决你的微信聊天记录备份与分析难题 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitH…...
猫抓资源嗅探扩展:5大核心功能彻底解析网络媒体捕获技术
猫抓资源嗅探扩展:5大核心功能彻底解析网络媒体捕获技术 【免费下载链接】cat-catch 猫抓 chrome资源嗅探扩展 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 猫抓(Cat-Catch)是一款开源免费的浏览器资源嗅探扩展&…...
从DTC诊断码到ECU恢复:深入解析车载CAN总线的BUSOFF快慢恢复机制
从DTC诊断码到ECU恢复:车载CAN总线BUSOFF快慢恢复机制实战指南 当CAN总线上的某个ECU因连续发送失败而触发BUSOFF状态时,整个车载网络的稳定性便面临严峻考验。作为汽车电子诊断工程师,我们常常需要在深夜的生产线上,面对闪烁的故…...
大模型入门学习教程(非常详细)非常详细收藏我这一篇就够了!大模型教程
本文系统介绍了LLM(大型语言模型)的基础知识,包括机器学习的数学基础、Python编程及其在数据科学中的应用、神经网络原理等。文章深入剖析了LLM科学家和工程师的角色,涵盖了大型语言模型架构、指令数据集构建、预训练模型、监督微…...
Catime终极指南:3个技巧让你成为Windows番茄时钟大师
Catime终极指南:3个技巧让你成为Windows番茄时钟大师 【免费下载链接】Catime A very useful timer (Pomodoro Clock).[一款非常好用的计时器(番茄时钟)] 项目地址: https://gitcode.com/gh_mirrors/ca/Catime Windows番茄时钟、桌面倒计时工具和时间管理软件…...
