我目前正在研究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/

10-12 20:37