Matlab 符号矩阵作为函数的参数而不是单个组件变量
Matlab symbolic matrix as argument of function instead of individual components variables
我想将涉及矩阵的符号表达式导出到文件:
% M is a 2x2 symbolic matrix composed by M_1_1, M_1_2, M_2_1, M_2_2
M = sym('M_%d_%d', [2 2], 'real');
% s1 and s2 are scalar variables
syms('s1', 's2');
% Expression with M, s1 and s2
myExpr = M*[s1;s2];
% Store expression as matlab code in a function file
matlabFunction(myExpr, 'file', 'myExprFunc.m');
但是,由于扩展表达式是:
myExpr =
M_1_1*s1 + M_1_2*s2
M_2_1*s1 + M_2_2*s2
这将创建一个具有扩展输入参数的函数(每个自由变量一个):
function myExpr = myExprFunc(M_1_1, M_1_2, M_2_1, M_2_2, s1, s2)
...
对于 20x20 矩阵,这是一场噩梦。如果有
这样的签名就好了
function myExpr = myExprFunc(M, s1, s2)
但似乎没有任何效果。直接的方法 matlabFunction(myExpr, 'file', 'myExprFunc.m', 'Vars', {'M', 's1', 's2'});
returns 是一个错误,因为自由变量 M_x_y
必须作为参数出现。
我当前的解决方案涉及创建一个包装函数,将各个变量分配为 M_x_y = M(x,y);
,但完成它会更好 "the pretty way".
有人知道解决方案吗?
在处理符号数学时不要使用字符串,例如 {'M', 's1', 's2'}
。这已被弃用,并且每个 Matlab 版本都不再直接支持这种用法。要实现你想要的,你可以使用:
M = sym('M_%d_%d', [2 2], 'real');
syms s1 s2;
myExpr = M*[s1;s2];
matlabFunction(myExpr, 'Vars', {M,s1,s2}, 'file', 'myExprFunc.m');
我想将涉及矩阵的符号表达式导出到文件:
% M is a 2x2 symbolic matrix composed by M_1_1, M_1_2, M_2_1, M_2_2
M = sym('M_%d_%d', [2 2], 'real');
% s1 and s2 are scalar variables
syms('s1', 's2');
% Expression with M, s1 and s2
myExpr = M*[s1;s2];
% Store expression as matlab code in a function file
matlabFunction(myExpr, 'file', 'myExprFunc.m');
但是,由于扩展表达式是:
myExpr =
M_1_1*s1 + M_1_2*s2
M_2_1*s1 + M_2_2*s2
这将创建一个具有扩展输入参数的函数(每个自由变量一个):
function myExpr = myExprFunc(M_1_1, M_1_2, M_2_1, M_2_2, s1, s2)
...
对于 20x20 矩阵,这是一场噩梦。如果有
这样的签名就好了function myExpr = myExprFunc(M, s1, s2)
但似乎没有任何效果。直接的方法 matlabFunction(myExpr, 'file', 'myExprFunc.m', 'Vars', {'M', 's1', 's2'});
returns 是一个错误,因为自由变量 M_x_y
必须作为参数出现。
我当前的解决方案涉及创建一个包装函数,将各个变量分配为 M_x_y = M(x,y);
,但完成它会更好 "the pretty way".
有人知道解决方案吗?
在处理符号数学时不要使用字符串,例如 {'M', 's1', 's2'}
。这已被弃用,并且每个 Matlab 版本都不再直接支持这种用法。要实现你想要的,你可以使用:
M = sym('M_%d_%d', [2 2], 'real');
syms s1 s2;
myExpr = M*[s1;s2];
matlabFunction(myExpr, 'Vars', {M,s1,s2}, 'file', 'myExprFunc.m');