当前位置: 首页 > news >正文

MATLAB M代码解释器设计与C++实现

在 MATLAB 中,数据结构、运算符、线性代数函数等是其核心组成部分。下面将系统地介绍:


一、MATLAB 中的主要数据结构

MATLAB 最常用的内置数据结构包括:

  1. 标量(Scalar):单个数值,如 a = 5;
  2. 向量(Vector)
    • 行向量:v = [1 2 3];
    • 列向量:v = [1; 2; 3];
  3. 矩阵(Matrix):二维数组,如 A = [1 2; 3 4];
  4. 多维数组(Multidimensional Arrays):三维及以上,如 A(:,:,2) = [1 2; 3 4];
  5. 元胞数组(Cell Array):可以存储不同类型的数据,使用 {} 定义,如 C = {1, 'text', [1 2]};
  6. 结构体(Structure):字段形式存储数据,使用 . 访问,如 S.name = 'Alice'; S.age = 25;
  7. 表(Table):类似数据库表格,如 T = table([1;2], {'M';'F'}, 'VariableNames', {'ID','Gender'});
  8. 字符串(String)与字符数组(Char)
    • 字符数组:str = 'hello';
    • 字符串对象(推荐):str = "hello";
  9. 分类数组(Categorical Array):用于有限集合的分类数据
  10. 函数句柄(Function Handle):如 f = @sin;

在本回答中,我们将重点放在 数值型数据结构(标量、向量、矩阵、多维数组) 上,因为它们是线性代数运算和大部分数学操作的基础。其他结构(如元胞、结构体、表等)更多用于数据组织与管理。


二、MATLAB 数据结构的基本运算和操作符号

1. 标量、向量、矩阵的算术运算

运算类型符号示例
加法+A + B
减法-A - B
乘法(逐元素).*A .* B
除法(逐元素)./A ./ B
幂(逐元素).^A .^ 2
矩阵乘法*A * B
矩阵左除(解线性方程组)\A \ b → 解 Ax = b
矩阵右除/B / A
转置'A' (共轭转置),A.'(非共轭转置)

2. 逻辑运算

运算符含义示例
&A & B
\|A \| B
~~A
xor异或xor(A,B)

3. 关系运算

运算符含义示例
==等于A == B
~=不等于A ~= B
<小于A < B
<=小于等于A <= B
>大于A > B
>=大于等于A >= B

4. 索引与切片

  • A(i,j):访问第 i 行第 j 列
  • A(:,j):第 j 列
  • A(i,:):第 i 行
  • A(1:3, 2:4):子矩阵
  • A(:):将矩阵展开为列向量
  • 逻辑索引:A(A > 0) → 所有大于 0 的元素

5. 常用函数

  • size(A):返回矩阵尺寸
  • length(A):最大维度长度
  • numel(A):总元素个数
  • reshape(A,m,n):改变形状
  • zeros(m,n)ones(m,n)eye(n)rand(m,n)randn(m,n):生成特殊矩阵

三、MATLAB 线性代数函数(Linear Algebra Functions)

MATLAB 提供了丰富的线性代数函数,涵盖:

1. 矩阵分解

函数功能示例
[L,U] = lu(A)LU分解L*U ≈ A
[Q,R] = qr(A)QR分解A ≈ Q*R
[U,S,V] = svd(A)奇异值分解A ≈ U*S*V'
[V,D] = eig(A)特征值与特征向量A*V = V*D
R = chol(A)Cholesky分解(对称正定)A = R'*R

2. 线性方程组求解

函数 / 操作功能示例
x = A \ b解线性方程组 Ax = b最常用方法
x = b / A解 xA = b
linsolve(A,b)更高效的线性求解器
pinv(A)*b伪逆求解最小二乘

3. 矩阵特性计算

函数功能示例
det(A)行列式det(A)
rank(A)rank(A)
trace(A)迹(对角线和)trace(A)
norm(A)矩阵或向量范数norm(A,2) 欧几里得范数
cond(A)条件数cond(A)
inv(A)逆矩阵(不推荐直接使用)A * inv(A) ≈ eye(size(A))

⚠️ 注意:对于大矩阵或病态矩阵,优先使用 \ 而不是显式计算 inv(A)

4. 其他矩阵函数

函数功能
diag(A)提取对角线 或 用向量构造对角矩阵
tril(A), triu(A)下三角 / 上三角部分
flipud(A), fliplr(A)上下 / 左右翻转
rot90(A)旋转矩阵
repmat(A,m,n)复制矩阵块

四、M 代码实例

✅ 实例 1:基本矩阵运算

% 定义矩阵
A = [1 2; 3 4];
B = [5 6; 7 8];% 矩阵加法
C = A + B;% 矩阵乘法
D = A * B;% 逐元素乘法
E = A .* B;% 矩阵转置
F = A';% 解线性方程组 Ax = b
b = [1; 2];
x = A \ b;

✅ 实例 2:线性代数函数应用

A = [4 1; 1 3];% 特征值与特征向量
[V, D] = eig(A);% 奇异值分解
[U, S, V] = svd(A);% 行列式
d = det(A);% 秩
r = rank(A);% 解线性系统
b = [1; 2];
x = A \ b;

✅ 实例 3:矩阵分解示例(LU、QR)

A = [1 2; 3 4];% LU 分解
[L, U] = lu(A);% QR 分解
[Q, R] = qr(A);% 验证
disp(L * U);   % 应接近 A
disp(Q * R);   % 应接近 A

✅ 实例 4:复杂综合实例 —— 图像滤波(使用矩阵运算)

假设我们有一个小型图像(矩阵),我们想进行 均值滤波(卷积的一种简化)

% 创建一个 5x5 的灰度图像矩阵(模拟)
img = magic(5)% 定义 3x3 均值滤波器
h = ones(3,3) / 9;% 为了简单,不考虑边界,直接做矩阵滑动(实际中会用 conv2 或 imfilter)
% 这里仅作演示:手动实现局部均值(取中心点周围 3x3 区域的均值)% 假设对内部区域做滤波(去除边界1层)
[rows, cols] = size(img);
filtered_img = zeros(rows-2, cols-2);for i = 2:rows-1for j = 2:cols-1window = img(i-1:i+1, j-1:j+1);filtered_img(i-1, j-1) = mean(window(:));end
enddisp('原始矩阵:');
disp(img);
disp('滤波后矩阵 (内部区域均值):');
disp(filtered_img);

该实例结合了:矩阵索引、矩阵运算、循环、统计函数(mean)、图像处理思想。这是典型的“矩阵 + 算法”复合应用。


五、总结:你需要的全部内容清单

类别内容是否包含实例
1. 数据结构标量、向量、矩阵、多维数组、元胞、结构体、表、字符串、分类、函数句柄
2. 基本运算符算术(+ - * / .* ./ .^)、矩阵乘除(*\/)、转置('.')、逻辑与关系
3. 线性代数函数LU、QR、SVD、特征值、行列式、秩、迹、逆、解方程(\)、范数、条件数等
4. M代码实例基础运算、线性代数函数、矩阵分解、综合图像滤波实例
5. 复合实例滤波(矩阵窗口操作 + 统计 + 循环)

下面是一个基于Cygwin g++和YACC的M代码解释器实现,支持批处理和交互式运行,包含变量存储、线性代数运算和.mat文件读写功能。

#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <memory>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <fstream>
#include <sstream>
#include <algorithm>
#include <functional>// MATIO库头文件
#include <matio.h>// 临时文件处理
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>// 定义矩阵数据类型
class Matrix {
public:std::vector<std::vector<double>> data;size_t rows;size_t cols;Matrix(size_t r = 0, size_t c = 0) : rows(r), cols(c) {data.resize(r, std::vector<double>(c, 0.0));}// 从MATIO矩阵读取数据bool fromMatio(matvar_t* matvar) {if (matvar == nullptr || matvar->class_type != MAT_C_DOUBLE || matvar->data == nullptr)return false;if (matvar->rank != 2) return false; // 只处理2D矩阵rows = matvar->dims[0];cols = matvar->dims[1];data.resize(rows, std::vector<double>(cols, 0.0));double* mat_data = static_cast<double*>(matvar->data);for (size_t i = 0; i < rows; i++) {for (size_t j = 0; j < cols; j++) {data[i][j] = mat_data[i + j * rows];}}return true;}// 转换为MATIO矩阵matvar_t* toMatio(const std::string& name) const {size_t dims[2] = {rows, cols};std::vector<double> linear_data(rows * cols);for (size_t i = 0; i < rows; i++) {for (size_t j = 0; j < cols; j++) {linear_data[i + j * rows] = data[i][j];}}return Mat_VarCreate(name.c_str(), MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, linear_data.data(), MAT_F_DONT_COPY_DATA);}// 保存到临时文件bool saveToTemp(int fd) const {if (fd < 0) return false;// 写入维度信息write(fd, &rows, sizeof(rows));write(fd, &cols, sizeof(cols));// 写入数据for (size_t i = 0; i < rows; i++) {write(fd, data[i].data(), cols * sizeof(double));}return true;}// 从临时文件加载bool loadFromTemp(int fd) {if (fd < 0) return false;// 读取维度信息read(fd, &rows, sizeof(rows));read(fd, &cols, sizeof(cols));// 分配空间data.resize(rows, std::vector<double>(cols, 0.0));// 读取数据for (size_t i = 0; i < rows; i++) {read(fd, data[i].data(), cols * sizeof(double));}return true;}
};// 变量类型枚举
enum class VarType {SCALAR,MATRIX,STRING,UNKNOWN
};// 变量值联合体
union VarValue {double scalar;Matrix* matrix;char* str;VarValue() : scalar(0) {}~VarValue() {}
};// 变量结构体
struct Variable {VarType type;VarValue value;std::string name;bool inMemory; // 标记是否在内存中Variable() : type(VarType::UNKNOWN), inMemory(true) {}~Variable() {freeResources();}void freeResources() {if (!inMemory) return;switch(type) {case VarType::MATRIX:delete value.matrix;break;case VarType::STRING:delete[] value.str;break;default:break;}type = VarType::UNKNOWN;}// 保存到临时文件bool saveToTemp(int fd) const {if (fd < 0) return false;// 写入类型int t = static_cast<int>(type);write(fd, &t, sizeof(t));// 写入名称长度和名称size_t name_len = name.size();write(fd, &name_len, sizeof(name_len));write(fd, name.c_str(), name_len);// 写入数据switch(type) {case VarType::SCALAR:write(fd, &value.scalar, sizeof(value.scalar));break;case VarType::MATRIX:value.matrix->saveToTemp(fd);break;case VarType::STRING:{size_t str_len = strlen(value.str);write(fd, &str_len, sizeof(str_len));write(fd, value.str, str_len);break;}default:break;}return true;}// 从临时文件加载bool loadFromTemp(int fd) {if (fd < 0) return false;freeResources();// 读取类型int t;read(fd, &t, sizeof(t));type = static_cast<VarType>(t);// 读取名称size_t name_len;read(fd, &name_len, sizeof(name_len));char* name_buf = new char[name_len + 1];read(fd, name_buf, name_len);name_buf[name_len] = '\0';name = name_buf;delete[] name_buf;// 读取数据switch(type) {case VarType::SCALAR:read(fd, &value.scalar, sizeof(value.scalar));break;case VarType::MATRIX:value.matrix = new Matrix();value.matrix->loadFromTemp(fd);break;case VarType::STRING:{size_t str_len;read(fd, &str_len, sizeof(str_len));value.str = new char[str_len + 1];read(fd, value.str, str_len);value.str[str_len] = '\0';break;}default:break;}inMemory = true;return true;}
};// 符号表
class SymbolTable {
private:std::map<std::string, Variable*> table;size_t memoryLimit;size_t currentMemory;std::string tempDir;// 计算变量占用的内存size_t calculateMemory(const Variable& var) const {switch(var.type) {case VarType::SCALAR:return sizeof(double);case VarType::MATRIX:if (var.value.matrix) {return var.value.matrix->rows * var.value.matrix->cols * sizeof(double) + sizeof(Matrix);}return 0;case VarType::STRING:return strlen(var.value.str) + 1;default:return 0;}}// 将变量交换到磁盘bool swapToDisk(const std::string& name) {auto it = table.find(name);if (it == table.end() || !it->second->inMemory) return false;// 创建临时文件std::string tempFile = tempDir + "/" + name + ".tmp";int fd = open(tempFile.c_str(), O_WRONLY | O_CREAT | O_TRUNC, 0644);if (fd < 0) return false;// 保存变量到临时文件bool success = it->second->saveToTemp(fd);close(fd);if (success) {// 释放内存资源currentMemory -= calculateMemory(*(it->second));it->second->inMemory = false;}return success;}// 从磁盘恢复变量bool restoreFromDisk(const std::string& name) {auto it = table.find(name);if (it == table.end() || it->second->inMemory) return false;// 打开临时文件std::string tempFile = tempDir + "/" + name + ".tmp";int fd = open(tempFile.c_str(), O_RDONLY);if (fd < 0) return false;// 从临时文件加载变量bool success = it->second->loadFromTemp(fd);close(fd);if (success) {currentMemory += calculateMemory(*(it->second));}return success;}public:SymbolTable(size_t memLimit = 100 * 1024 * 1024) : memoryLimit(memLimit), currentMemory(0) {// 创建临时目录tempDir = "/tmp/matlab_interpreter_" + std::to_string(getpid());mkdir(tempDir.c_str(), 0755);}~SymbolTable() {// 清理所有变量for (auto& pair : table) {delete pair.second;}// 删除临时目录system(("rm -rf " + tempDir).c_str());}// 添加或更新变量bool setVariable(const std::string& name, Variable* var) {// 检查内存限制size_t varMemory = calculateMemory(*var);if (currentMemory + varMemory > memoryLimit) {// 尝试释放一些内存for (auto& pair : table) {if (pair.second->inMemory && pair.first != name) {swapToDisk(pair.first);if (currentMemory + varMemory <= memoryLimit) break;}}// 如果仍然不够,返回错误if (currentMemory + varMemory > memoryLimit) {delete var;return false;}}// 删除已存在的变量auto it = table.find(name);if (it != table.end()) {currentMemory -= calculateMemory(*(it->second));delete it->second;}// 添加新变量table[name] = var;currentMemory += varMemory;return true;}// 获取变量Variable* getVariable(const std::string& name) {auto it = table.find(name);if (it == table.end()) return nullptr;// 如果变量在磁盘上,尝试恢复if (!it->second->inMemory) {if (!restoreFromDisk(name)) return nullptr;}return it->second;}// 检查变量是否存在bool exists(const std::string& name) const {return table.find(name) != table.end();}// 从.mat文件加载变量bool loadFromMat(const std::string& filename) {mat_t* matfp = Mat_Open(filename.c_str(), MAT_ACC_RDONLY);if (!matfp) return false;matvar_t* matvar;while ((matvar = Mat_VarReadNextInfo(matfp)) != nullptr) {// 只处理可以读取的变量if (Mat_VarReadDataAll(matfp, matvar) == 0) {Variable* var = new Variable();var->name = matvar->name;if (matvar->class_type == MAT_C_DOUBLE && matvar->rank == 2) {// 矩阵变量if (matvar->dims[0] == 1 && matvar->dims[1] == 1) {// 标量var->type = VarType::SCALAR;double* data = static_cast<double*>(matvar->data);var->value.scalar = data[0];} else {// 矩阵var->type = VarType::MATRIX;var->value.matrix = new Matrix();var->value.matrix->fromMatio(matvar);}} else if (matvar->class_type == MAT_C_CHAR) {// 字符串变量var->type = VarType::STRING;size_t len = matvar->dims[0] * matvar->dims[1] + 1;var->value.str = new char[len];strncpy(var->value.str, static_cast<char*>(matvar->data), len);var->value.str[len-1] = '\0';}// 添加到符号表setVariable(var->name, var);}Mat_VarFree(matvar);}Mat_Close(matfp);return true;}// 保存变量到.mat文件bool saveToMat(const std::string& filename) {mat_t* matfp = Mat_CreateVer(filename.c_str(), nullptr, MAT_FT_MAT5);if (!matfp) return false;for (const auto& pair : table) {Variable* var = pair.second;// 确保变量在内存中if (!var->inMemory) {if (!restoreFromDisk(var->name)) continue;}matvar_t* matvar = nullptr;switch(var->type) {case VarType::SCALAR:{size_t dims[2] = {1, 1};matvar = Mat_VarCreate(var->name.c_str(), MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, &var->value.scalar, 0);break;}case VarType::MATRIX:matvar = var->value.matrix->toMatio(var->name);break;case VarType::STRING:{size_t len = strlen(var->value.str);size_t dims[2] = {1, len};matvar = Mat_VarCreate(var->name.c_str(), MAT_C_CHAR, MAT_T_UTF8, 2, dims, var->value.str, 0);break;}default:break;}if (matvar) {Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB);Mat_VarFree(matvar);}}Mat_Close(matfp);return true;}
};// 线性代数函数库
class LinearAlgebra {
public:// 矩阵加法static Matrix* add(const Matrix& a, const Matrix& b) {if (a.rows != b.rows || a.cols != b.cols) return nullptr;Matrix* result = new Matrix(a.rows, a.cols);for (size_t i = 0; i < a.rows; i++) {for (size_t j = 0; j < a.cols; j++) {result->data[i][j] = a.data[i][j] + b.data[i][j];}}return result;}// 矩阵乘法static Matrix* multiply(const Matrix& a, const Matrix& b) {if (a.cols != b.rows) return nullptr;Matrix* result = new Matrix(a.rows, b.cols);for (size_t i = 0; i < a.rows; i++) {for (size_t j = 0; j < b.cols; j++) {for (size_t k = 0; k < a.cols; k++) {result->data[i][j] += a.data[i][k] * b.data[k][j];}}}return result;}// 矩阵转置static Matrix* transpose(const Matrix& a) {Matrix* result = new Matrix(a.cols, a.rows);for (size_t i = 0; i < a.rows; i++) {for (size_t j = 0; j < a.cols; j++) {result->data[j][i] = a.data[i][j];}}return result;}// 更多线性代数函数...
};// YACC语法解析器外部接口
extern int yyparse();
extern FILE* yyin;
extern void yyrestart(FILE*);
extern int yylex_destroy();// 全局符号表
SymbolTable symbolTable;// 语法解析器接口函数
void executeAssignment(const std::string& name, Variable* value) {symbolTable.setVariable(name, value);
}Variable* executeBinaryOperation(Variable* left, Variable* right, const std::string& op) {if (!left || !right) return nullptr;// 处理标量运算if (left->type == VarType::SCALAR && right->type == VarType::SCALAR) {Variable* result = new Variable();result->type = VarType::SCALAR;if (op == "+") result->value.scalar = left->value.scalar + right->value.scalar;else if (op == "-") result->value.scalar = left->value.scalar - right->value.scalar;else if (op == "*") result->value.scalar = left->value.scalar * right->value.scalar;else if (op == "/") result->value.scalar = left->value.scalar / right->value.scalar;else {delete result;return nullptr;}return result;}// 处理矩阵运算if (left->type == VarType::MATRIX && right->type == VarType::MATRIX) {Matrix* result = nullptr;if (op == "+") result = LinearAlgebra::add(*left->value.matrix, *right->value.matrix);else if (op == "*") result = LinearAlgebra::multiply(*left->value.matrix, *right->value.matrix);if (result) {Variable* var = new Variable();var->type = VarType::MATRIX;var->value.matrix = result;return var;}}return nullptr;
}Variable* executeFunctionCall(const std::string& funcName, const std::vector<Variable*>& args) {if (funcName == "transpose" && args.size() == 1 && args[0]->type == VarType::MATRIX) {Matrix* result = LinearAlgebra::transpose(*args[0]->value.matrix);Variable* var = new Variable();var->type = VarType::MATRIX;var->value.matrix = result;return var;}// 更多函数处理...return nullptr;
}// 主程序
int main(int argc, char* argv[]) {// 处理命令行参数bool interactive = false;std::string matFile;for (int i = 1; i < argc; i++) {if (strcmp(argv[i], "-i") == 0) {interactive = true;} else if (strcmp(argv[i], "-load") == 0 && i + 1 < argc) {matFile = argv[++i];}}// 从.mat文件加载变量if (!matFile.empty()) {if (!symbolTable.loadFromMat(matFile)) {std::cerr << "Warning: Could not load variables from " << matFile << std::endl;}}// 批处理模式if (!interactive && argc > 1 && argv[1][0] != '-') {FILE* inputFile = fopen(argv[1], "r");if (!inputFile) {std::cerr << "Error: Could not open file " << argv[1] << std::endl;return 1;}yyin = inputFile;yyparse();fclose(inputFile);} // 交互式模式else if (interactive) {std::cout << "M-code Interpreter (type 'exit' to quit)" << std::endl;while (true) {std::cout << ">> ";std::string line;std::getline(std::cin, line);if (line == "exit" || line == "quit") break;// 将输入写入临时文件供YACC解析std::ofstream tmpFile("/tmp/matlab_tmp.m");tmpFile << line;tmpFile.close();FILE* input = fopen("/tmp/matlab_tmp.m", "r");if (input) {yyrestart(input);yyparse();fclose(input);}}}// 保存变量到.mat文件if (argc > 2) {for (int i = 1; i < argc; i++) {if (strcmp(argv[i], "-save") == 0 && i + 1 < argc) {symbolTable.saveToMat(argv[++i]);break;}}}yylex_destroy();return 0;
}

YACC语法文件 (parser.y)

%{
#include <iostream>
#include <string>
#include <vector>
#include "matrix.hpp" // 包含Matrix和Variable的定义// 外部函数声明
extern void executeAssignment(const std::string& name, Variable* value);
extern Variable* executeBinaryOperation(Variable* left, Variable* right, const std::string& op);
extern Variable* executeFunctionCall(const std::string& funcName, const std::vector<Variable*>& args);// 全局变量
Variable* resultVar = nullptr;
std::vector<Variable*> argList;%}%union {char* str;double num;Variable* var;
}%token <str> IDENTIFIER
%token <num> NUMBER
%token ASSIGN
%token LPAREN RPAREN
%token COMMA
%token PLUS MINUS TIMES DIVIDE%type <var> expression factor term func_call%%input:/* empty */| input line
;line:expression ';' { if (resultVar) {// 处理表达式结果delete resultVar;resultVar = nullptr;}}| IDENTIFIER ASSIGN expression ';' {executeAssignment($1, resultVar);resultVar = nullptr;free($1);}| func_call ';' {if (resultVar) {// 处理函数调用结果delete resultVar;resultVar = nullptr;}}
;expression:expression PLUS term { resultVar = executeBinaryOperation(resultVar, $3, "+");}| expression MINUS term {resultVar = executeBinaryOperation(resultVar, $3, "-");}| term
;term:term TIMES factor {resultVar = executeBinaryOperation(resultVar, $3, "*");}| term DIVIDE factor {resultVar = executeBinaryOperation(resultVar, $3, "/");}| factor
;factor:NUMBER {resultVar = new Variable();resultVar->type = VarType::SCALAR;resultVar->value.scalar = $1;}| IDENTIFIER {// 从符号表获取变量resultVar = symbolTable.getVariable($1);free($1);}| func_call| LPAREN expression RPAREN {resultVar = $2;}
;func_call:IDENTIFIER LPAREN arg_list RPAREN {resultVar = executeFunctionCall($1, argList);free($1);// 清理参数列表for (auto arg : argList) delete arg;argList.clear();}
;arg_list:expression { argList.push_back(resultVar); resultVar = nullptr; }| arg_list COMMA expression { argList.push_back(resultVar); resultVar = nullptr; }
;%%// 错误处理函数
void yyerror(const char* s) {std::cerr << "Syntax error: " << s << std::endl;
}

编译说明

  1. 需要安装MATIO库: apt-get install libmatio-dev 或从源码编译
  2. 编译步骤:
    flex lexer.l
    bison -d parser.y
    g++ -o matlab_interpreter parser.tab.c lex.yy.c main.cpp -lmatio
    

使用示例

  1. 批处理模式:

    ./matlab_interpreter -load input.mat script.m -save output.mat
    
  2. 交互式模式:

    ./matlab_interpreter -i
    >> A = [1, 2; 3, 4];
    >> B = transpose(A);
    >> C = A * B;
    

这个实现提供了基本的M代码解释功能,包括变量存储、线性代数运算和.mat文件支持。内存管理机制会在内存不足时自动将变量交换到磁盘临时文件。

http://www.dtcms.com/a/394449.html

相关文章:

  • nivida jetson orinnx torch环境搭建
  • Java进阶教程,全面剖析Java多线程编程,线程的生命周期,笔记11
  • Javase 基础加强 —— 12 网络编程
  • 【04】EPGF 架构搭建教程之 工具环境变量的配置
  • Oracle -运维学习路线 --学习篇1
  • 三个余弦:平方和凑成1时会发生什么
  • 碧蓝航线装备参数探究——关于金色之耻
  • Golang圖書館
  • linux命令--迭代积累
  • Unity2D-物理系统
  • 崩铁 预言算牌 解谜
  • 解锁AI巨型模型训练:DeepSpeed ZeRO Offload 全面指南
  • python语言中的常用容器(集合)
  • Python 程序控制流程综合编程
  • Java进阶教程,全面剖析Java多线程编程,同步方法,笔记13
  • 1.6 虚拟机 (答案见原书 P33)
  • 【C++练习】26.在 C++ 中,不使用 “strcpy“ 函数将一个字符串复制到另一个字符串
  • 【分布式技术】Baerer token刷新机制详细解读
  • 第十三章 Ant与Jenkins的集成
  • 通义万相正式开源Wan2.2-Animate动作生成模型
  • 课后作业-2025-09-21
  • 比 IDEA 容器自动化部署更轻量便捷的工具
  • 知识图谱技术对自然语言处理深层语义分析的影响与启示研究
  • Javase 高级技术 —— 01 反射
  • Linux 孤儿进程与进程的优先级和切换和调度
  • QML学习笔记(七)QML的基本数据类型
  • 基于51单片机电子钟闹钟12/24小时制LCD显示
  • 小程序开发全解析:从结构到API
  • 异步方法在C#中的使用
  • js时间戳转换日期格式 yyyy-mm-dd