核心基础函数MatMultiply
这个 MatMultiply 函数是 Dummy-Robot 运动学解算的核心基础函数,负责实现矩阵乘法,而矩阵乘法又是DH变换(机器人运动学的核心)的关键操作。
一、函数整体功能
这个函数实现了通用的矩阵乘法,接收两个输入矩阵(_matrix1 和 _matrix2),计算它们的乘积并将结果存储到输出矩阵(_matrixOut)中。
二、逐行代码解析
1. 函数参数说明
static void MatMultiply(
const float* _matrix1, // 输入矩阵1(m行×l列)
const float* _matrix2, // 输入矩阵2(l行×n列)
float* _matrixOut, // 输出矩阵(m行×n列)
const int _m, // 矩阵1的行数 , 输出矩阵的行数
const int _l, // 矩阵1的列数 = 矩阵2的行数(矩阵相乘的核心条件)
const int _n // 矩阵2的列数 , 输出矩阵的列数
)
- 矩阵乘法规则:只有当矩阵1的列数 = 矩阵2的行数(即
_l)时,才能相乘,输出矩阵维度为m×n。 - 注意:在嵌入式开发中,为了减少内存开销,通常把二维矩阵用一维数组存储(行优先:先存第一行所有元素,再存第二行,以此类推)。
2. 核心变量与循环逻辑
float tmp; // 临时变量,存储单个元素的累加结果
int i, j, k; // 循环索引:i=行索引,j=列索引,k=累加索引
// 外层循环:遍历输出矩阵的每一行(共_m行)
for (i = 0; i < _m; i++)
{
// 中层循环:遍历输出矩阵的每一列(共_n列)
for (j = 0; j < _n; j++)
{
tmp = 0.0f; // 每次计算新元素前,重置累加值
// 内层循环:计算当前(i,j)位置的元素值(累加_l次)
for (k = 0; k < _l; k++)
{
// 核心计算:矩阵1第i行第k列 × 矩阵2第k行第j列,累加到tmp
// 一维数组索引换算(行优先):
// 矩阵1(i,k) = _l * i + k
// 矩阵2(k,j) = _n * k + j
tmp += _matrix1[_l * i + k] * _matrix2[_n * k + j];
}
// 将累加结果存入输出矩阵的(i,j)位置
// 输出矩阵(i,j) = _n * i + j
_matrixOut[_n * i + j] = tmp;
}
}
三、补充说明
- static关键字:函数前加
static表示该函数仅在当前.cpp文件内可见(模块化封装,避免命名冲突); - 精度问题:使用
float而非double,是嵌入式MCU(如STM32F4)的常见选择——float占用更少内存,且STM32F4的FPU硬件支持float加速,计算更快; - 无边界检查:代码未做参数合法性校验(如
_m/_l/_n是否为0),这是嵌入式代码的特点(追求效率,通常由调用方保证参数合法)。 - void:函数返回值类型,void 表示「无」,这里特指这个函数没有任何返回值。
- const:只读修饰符(常量限定),const 加在变量 / 指针前,表示「这个内容是只读的,程序运行中不能修改」。
- *:指针符号,在 C/C++ 中,数组不能直接作为函数参数传递,实际传递的是数组的「首地址」(指针)—— 比如你传入一个float T1[16]的数组,函数里接收到的其实是float*(指向数组第一个元素的地址)。
浙公网安备 33010602011771号