3

我目前正在研究 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某种方式迭代解决方案向量以获得问题的所有解决方案。问题在于 line 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())是一个丑陋的解决方法。

4

1 回答 1

0

总是有动态字段命名(也许不会更优雅)

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.

于 2015-02-19T17:39:52.027 回答