Amoiensis / Matrix_hub

A lib of Matrix operation for C language. (矩阵运算库--C语言)
Apache License 2.0
234 stars 53 forks source link

MATRIX_TYPE 不能改为float #14

Open tkpang opened 10 months ago

tkpang commented 10 months ago

/ Num Type of Matrix - 矩阵数值类型/

define MATRIX_TYPE double

define TRANS_TYPE double

这里改成float会出大麻烦,求逆全错。这是我踩的坑,反馈一下,希望标注在注释里。 (背景:我在开发一个单片机项目,希望存储空间小,自己改成了float,结果debug de了三天哈哈哈,希望后面的人看到不要踩坑。)

最后感谢作者提供的轻量矩阵运算库,虽然很多地方不完美,但是纯c轻量在单片机领域真的很有用。

Amoiensis commented 10 months ago

非常感谢,您对与本项目的使用和支持!

关于数据类型float的问题,将下一版更新中得到具体解决,如果可以欢迎您提交代码贡献,Debug辛苦了(= v =)不好意思。亦将在下个版本更新中鸣谢。

是的这个项目也是主要单片机上轻量、易用,方便大家后续开发,欢迎一起维护和贡献这个项目。

如果有遇到任何其他问题或者想要交流的,也非常欢迎直接邮件给我交流哇~ (mail: Amoiensis@outlook.com)。

祝工作学习顺利

645770225 commented 10 months ago

具体是哪有问题,为啥我改成float运算正常的

Amoiensis commented 10 months ago

具体是哪有问题,为啥我改成float运算正常的

你好,之前在写的时候应该是避免出现问题的,但具体还没仔细测试,如果有问题,将在这个帖子内进行回复。您那边是修改为float 使用是可以的不?

如果有遇到任何其他问题,欢迎直接邮件给我~ (mail: Amoiensis@outlook.com)。

Amoiensis commented 10 months ago

/ Num Type of Matrix - 矩阵数值类型/ #define MATRIX_TYPE double #define TRANS_TYPE double

这里改成float会出大麻烦,求逆全错。这是我踩的坑,反馈一下,希望标注在注释里。 (背景:我在开发一个单片机项目,希望存储空间小,自己改成了float,结果debug de了三天哈哈哈,希望后面的人看到不要踩坑。)

最后感谢作者提供的轻量矩阵运算库,虽然很多地方不完美,但是纯c轻量在单片机领域真的很有用。

@tkpang 这边可以把具体出现的问题截图或者详述一下吗,这样我们可以更好定位问题,如有问题加快后续完善修改。

645770225 commented 10 months ago

具体是哪有问题,为啥我改成float运算正常的

你好,之前在写的时候应该是避免出现问题的,但具体还没仔细测试,如果有问题,将在这个帖子内进行回复。您那边是修改为float 使用是可以的不?

如果有遇到任何其他问题,欢迎直接邮件给我~ (mail: Amoiensis@outlook.com)。

我应该是把程序里出现的double都改成了float,求逆没碰到问题

645770225 commented 8 months ago

float类型应该是精度问题会导致求逆有误差,行列初等变换完成后,矩阵应该为对角阵,但如果有一个对角线元素特别小,比如2e-5这种,那和它同行元素因为精度只能到1e-6,就会导致计算误差,这里给出一个测试矩阵:

 MATRIX_TYPE array_num[9] = {7.37792587, 3.00000000, 6.00000000,
                                3.00000000, 5.37792587, 1.00000000,
                                6.00000000, 1.00000000, 5.37792587};
    Matrix *test_3 = Matrix_gen(3, 3, array_num);
    M_print(test_3, "test_3");
    Matrix *test_5 = M_Inverse(test_3);
    M_print(test_5, "test_5");
    Matrix *test_7 = M_mul(test_5,test_3);
    M_print(test_7,"test_7");
645770225 commented 8 months ago

此外float类型确实会导致比较大的求逆误差,建议还是用double类型