我目前正在研究Matlab函数。
function d = sym_fun(E,A,C)
[n,m] = size(A);
if n==m
X = sym('X%d%d', [n,n]);
Xres = solve(A'*X*E+E'*X*A+E'*(C'*C)*E==0,X);
xres = sym('x%d%d', size(Xres));
for i=1:size(Xres)
xres(i)=Xres(i);
end %for
LD = reshape(xres, [n,n]);
d = diag(LD);
end %if
我正在尝试处理可变大小的符号矩阵。我需要以某种方式遍历解决方案向量
Xres
以获得问题的所有解决方案。问题出在xres(i)=Xres(i)
行中,Xres(i)
返回一个结构,我实际上需要用xres(i)=Xres.X%d%d
调用%d=i
才能起作用。我不知道该如何编码。一个更好的解决方案是,如果我可以跳过所有这些,以某种方式直接将解决方案保存到矩阵中。类似于以下内容:
X = sym('X%d%d', [n,n]);
xres = sym('x%d%d', size(Xres));
xres = solve(A'*X*E+E'*X*A+E'*(C'*C)*E==0,X);
LD = reshape(xres, [n,n]);
d = diag(LD);
我的工作,这个问题的丑陋解决方案。
function d = fun(E,A,C)
[n,m] = size(A);
if n==m
X = sym('X%d%d', [n,n]);
Xres = solve(A'*X*E+E'*X*A+E'*(C'*C)*E==0,X);
P = sym('x%d%d', [n,n]);
for i=1:n
for j=1:n
P(i,j)= eval(sprintf('Xres.X%d%d',i,j))
end %for
end %for
d = diag(P);
end %if
请给我看一个更好的;
eval(sprintf())
是一个丑陋的解决方法。 最佳答案
总是有动态的字段命名(也许没有那么优雅)
P(i,j) = Xres.(sprintf('X%d%d',i,j));
如果您希望将
solve
的结果转换为数字,该如何做:xres = structfun(@double,xres);
LD = reshape(xres, [n,n]);
d = diag(LD);
(不确定此处是否100%保留订单,可能需要在您的实际解决方案中再次进行检查)。
处理结构输出的另一个选项是
struct2cell
。关于matlab - Matlab求解函数:如何将可变大小的解转换为矩阵形式?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28604507/