c - C指针,二维矩阵返回
问题描述
#include <stdio.h>
#define _USE_MATH_DEFINES
#include <math.h>
// OMNI Encoder value -0.000000, -0.268890, 3.781295, -0.000106, -2.366794, 0.250667
float encoder[6] = {-0.000000f, -0.268890f, 3.781295f, -0.000106f, -2.366794f, 0.250667f};
float d_g[6] = {0.125f, 0, 0.2f, 0.1325f, 0, 0.039f};
float a_g[6] = {0, 0, 0.134f, 0, 0, 0};
float alpha_g[6] = {0, -M_PI/2, 0, M_PI/2, -M_PI/2, -M_PI/2};
#define ARR_ROW_SIZE 4
#define ARR_COL_SIZE 4
float(*MM())[4];
float(*DH_Master())[4];
float(*FK_Master())[4];
void PrintArray(float(*arr)[4], int row, int col);
void PrintArray(float(*arr)[4], int row, int col){
for (int i = 0; i < row; i++){
for (int j = 0; j < col; j++){
printf("%f ", arr[i][j]);
}
printf("\n");
}
}
// Matrix Multiplication
float(*MM(float M1[][4], float M2[][4]))[4] {
static float C[4][4] = {
{ 0.000f , 0.000f , 0.000f , 0.000f },
{ 0.000f , 0.000f , 0.000f , 0.000f },
{ 0.000f , 0.000f , 0.000f , 0.000f },
{ 0.000f , 0.000f , 0.000f , 0.000f }};
float tmp;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
tmp = 0.0f;
for (int k = 0; k < 4; k++) {
tmp += M1[i][k] * M2[k][j];
}
C[i][j] = tmp;
}
}
return C;
}
float(*DH_Master(float alpha, float a, float d, float theta))[4]{
printf("alpha %f / theta %f / a %f / d %f\n", alpha, theta, a, d);
float T_a[4][4] = {
{ 1.000f , 0.000f , 0.000f , a },
{ 0.000f , 1.000f , 0.000f , 0.000f },
{ 0.000f , 0.000f , 1.000f , 0.000f },
{ 0.000f , 0.000f , 0.000f , 1.000f }};
float T_d[4][4] = {
{ 1.000f , 0.000f , 0.000f , 0.000f },
{ 0.000f , 1.000f , 0.000f , 0.000f },
{ 0.000f , 0.000f , 1.000f , d },
{ 0.000f , 0.000f , 0.000f , 1.000f }};
float Rzt[4][4] = {
{ cosf(theta) , -sinf(theta), 0.000f , 0.000f },
{ sinf(theta) , cosf(theta), 0.000f , 0.000f },
{ 0.000f , 0.000f , 1.000f , 0.000f },
{ 0.000f , 0.000f , 0.000f , 1.000f }};
float Rxa[4][4] = {
{ 1.000f , 0.000f , 0.000f , 0.000f },
{ 0.000f , cosf(alpha) , -sinf(alpha), 0.000f },
{ 0.000f , sinf(alpha) , cosf(alpha), 0.000f },
{ 0.000f , 0.000f , 0.000f , 1.000f }};
float(*C1)[4] = MM(Rxa, T_a);
float(*C2)[4] = MM(C1, T_d);
float(*C3)[4] = MM(C2, Rzt);
PrintArray(C3, ARR_ROW_SIZE, ARR_COL_SIZE);
printf("//////////////////////////////////////////////////////////\n");
return C3;
}
float(*FK_Master(float encoder[]))[4]{
printf("T01\n");
float(*T01)[ARR_COL_SIZE] = DH_Master(0, 0, 0.125, encoder[0] -M_PI/2);
printf("T12\n");
float(*T12)[ARR_COL_SIZE] = DH_Master(-M_PI/2, 0, 0, encoder[1]);
printf("T23\n");
float(*T23)[ARR_COL_SIZE] = DH_Master(0, 0.134, 0.2, encoder[2]);
printf("T34\n");
float(*T34)[ARR_COL_SIZE] = DH_Master(M_PI/2, 0, 0.1325, encoder[3]);
printf("T45\n");
float(*T45)[ARR_COL_SIZE] = DH_Master(-M_PI/2, 0, 0, encoder[4]);
printf("T56\n");
float(*T56)[ARR_COL_SIZE] = DH_Master(-M_PI/2, 0, 0.039, encoder[5]);
printf("T01\n");
PrintArray(T01, ARR_ROW_SIZE, ARR_COL_SIZE);
float(*T02)[ARR_COL_SIZE] = (MM(T01, T12));
printf("T02\n");
PrintArray(T02, ARR_ROW_SIZE, ARR_COL_SIZE);
float(*T03)[ARR_COL_SIZE] = (MM(T02, T23));
printf("T03\n");
PrintArray(T03, ARR_ROW_SIZE, ARR_COL_SIZE);
float(*T04)[ARR_COL_SIZE] = (MM(T03, T34));
printf("T04\n");
PrintArray(T04, ARR_ROW_SIZE, ARR_COL_SIZE);
float(*T05)[ARR_COL_SIZE] = (MM(T04, T45));
printf("T05\n");
PrintArray(T05, ARR_ROW_SIZE, ARR_COL_SIZE);
float(*T06)[ARR_COL_SIZE] = (MM(T05, T56));
printf("T06\n");
PrintArray(T06, ARR_ROW_SIZE, ARR_COL_SIZE);
return 0;
}
int main(void) {
float(*Art)[ARR_COL_SIZE] = FK_Master(encoder);
return 0;
}
让我解释一下这个问题。
以前,我在MATLAB或Python环境中计算过。
这次我将再次使用 C 支付。
我做了几次二维矩阵运算,我正在编写一个再次返回计算值的代码。
简单来说,使用顶部定义的a、d、alpha、theta进行二维矩阵运算,T01、T12、...我们正在编写一个计算T01 * T12 * T23 * T34 * T45 * T56的代码通过T56总共获得6个值后。
但是,当前的计算结果并没有正确输出。
如果您能帮我解决这个问题,我将不胜感激。
我会将正确的计算结果作为图片附上。
解决方案
推荐阅读
- windows - 调用命令错误,尝试通过脚本从 dc 的特定 OU 获取链接的 GPO
- discord - 在 Discord.py 中获取用户总邀请
- vector - 向量的解构
- python - 如何列出目录的 txt 文件?
- python - 当两个字典一起实例化时,更新一个会影响另一个。为什么?
- sdk - Docusign 未找到或禁用指定的集成商密钥。未指定 Integrator 密钥
- c - gnu库C中的libc_hidden_proto宏
- amazon-web-services - AWS CLI 要求默认配置文件是强制性的吗?
- docker - 如何完全删除快照应用程序(docker)
- javascript - JavaScript if 语句突然停止工作