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