Matlab Coder生成C代码时矩阵取列值结果错误如何解决
问题根因
Matlab默认采用列优先的矩阵内存存储规则,Matlab Coder生成的C代码默认沿用该规则,你给出的生成代码逻辑是符合你的Matlab函数预期的:4行2列矩阵的第一列占内存前4位,第二列占内存后4位,所以取A[4+i0]计算。你得到错误结果的核心原因是你调用C函数时传入的A数组是按照C语言常用的行优先规则排布的,二者内存布局不匹配。
解决方法
- 调整C侧传入参数的内存布局:按照列优先规则构造A数组,先存储矩阵所有行的第0列元素,再依次存储后续列的所有元素,再传入生成的
fn1函数即可得到正确结果。 - 全局修改Coder生成规则为行优先:
- 打开Matlab Coder的项目配置界面,进入高级参数分类
- 找到
Array layout(数组布局)配置项,将默认值Column-major(列优先)修改为Row-major(行优先) - 重新生成代码,此时生成的代码会适配C语言常用的行优先内存排布,直接按行优先传参即可。
- 单函数指定行优先生成:如果不需要全局修改配置,可在你的Matlab函数开头添加一行
coder.rowMajor;指令,仅指定当前函数按行优先规则生成代码,修改后的Matlab代码如下:
function [ B ] = fn1( A ) coder.rowMajor; a = A(:,2); B = a+1; end
重新生成后即可得到适配行优先布局的C代码。
内容的提问来源于stack exchange,提问作者smdbh
相关产品推荐
相关产品推荐

