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

Is there a MATLAB function to convert symbolic expressions to MATLAB code indexing?

示例:我有一个这样的数组 R = sym('R',[4 4])。我做了一些符号运算并得到一个表达式,它是 R1_2、R2_2 等东西的函数。我想将表达式粘贴到一些代码中,但我真的希望它看起来像像 R(1,2), R(2,2) 等。是否有函数可以做到这一点,或者我需要手动 find/replace 16 次?

您可以使用正则表达式

作为示例,我正在使用行列式函数,并且我正在定义大小为 3x3 的 R 以保存 space。但是代码是通用的。

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)

您可以将变量 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)))