是否有MATLAB函数将符号表达式转换为MATLAB代码索引?

时间:2015-03-27 16:51:17

标签: matlab symbolic-math

示例:我有一个像这样的数组R = sym(' R',[4 4])。我做了一些符号操作并得到一个表达式,这是R1_2,R2_2之类的东西的函数。我想将表达式粘贴到某些代码中,但我真的希望它看起来像R(1,2) ),R(2,2)等。是否有这样的功能,或者我需要手动查找/替换16次?

2 个答案:

答案 0 :(得分:2)

您可以使用正则表达式

作为一个例子,我正在使用行列式函数,我正在定义大小为3x3的R以节省空间。但代码是通用的。

R = sym('R',[3 3]); %// example matrix
f = det(R); %// example function
str = char(f); %// convert to string
[split, match] = regexp(str, '\d+_\d+','split','match'); %// split string according
    %// to pattern "digits underscore digits"
match2 = cellfun(@ (x) ['(' regexprep(x, '_', ',') ')'] , match, 'uniformoutput', 0);
    %// replace `_` by `,` and include parentheses
match2{end+1} = ''; %// equalize number of cells, for concatenation
result = [split; match2]; %// concatenate cells
result = [result{:}]; %// concatenage strings 

在此示例中,符号函数f

f =
R1_1*R2_2*R3_3 - R1_1*R2_3*R3_2 - R1_2*R2_1*R3_3 + R1_2*R2_3*R3_1 + R1_3*R2_1*R3_2 - R1_3*R2_2*R3_1

结果给出以下字符串:

result =
R(1,1)*R(2,2)*R(3,3) - R(1,1)*R(2,3)*R(3,2) - R(1,2)*R(2,1)*R(3,3) + R(1,2)*R(2,3)*R(3,1) + R(1,3)*R(2,1)*R(3,2) - R(1,3)*R(2,2)*R(3,1)

答案 1 :(得分:2)

您可以使用未知函数R代替变量R:

R = sym('R',[3 3]);
M=det(R)
funR = symfun(sym('R(x, y)'),[sym('x'),sym('y')]);
for rndx=1:size(R,1)
    for cndx=1:size(R,2)
        M=subs(M,R(rndx,cndx),funR(rndx,cndx));
    end   
end

输出:

R(1, 1)*R(2, 2)*R(3, 3) - R(1, 1)*R(2, 3)*R(3, 2) - R(1, 2)*R(2, 1)*R(3, 3) + R(1, 2)*R(3, 1)*R(2, 3) + R(2, 1)*R(1, 3)*R(3, 2) - R(1, 3)*R(2, 2)*R(3, 1)

上面代码的矢量化版本(更快):

[rndx,cndx]=ind2sub(size(R),1:numel(R));
M2=subs(M,num2cell(R(:))',num2cell(funR(rndx,cndx)))