如果输入表达式包含符号变量,请改用VPA函数吗?

时间:2014-02-16 23:25:27

标签: matlab matrix symbolic-math

使用eigval减去对角线值,并将新值存储在矩阵Diagonal中:

   CovarianceMatrix=[8 -3 1;2 1 0;3 4 5];
   Col=3;
   Row=3;
   store=1;
    syms eigval;

   for loop1= Col:-1:1
    Rw=1;
    syms eigval;
    for loop2= 1:Row
        if Rw==loop1
            Diagonal= (CovarianceMatrix(Rw,loop1)-eigval);
             Fix_Diagonal_2(loop2,store)=sym(Diagonal);
        else
            Diagonal= CovarianceMatrix(Rw,loop1);
            Fix_Diagonal_2(loop2,store)=Diagonal;
        end

        Rw=Rw+1;
        loop1=loop1-1;

        if loop1==0
             loop1=3;
        end

    end
    store=store+1;

end

但是因为我使用的是符号变量,所以会出错:

      The following error occurred converting from sym to double:
      Error using mupadmex
      Error in MuPAD command: DOUBLE cannot convert the input expression into a double
      array.

      If the input expression contains a symbolic variable, use the VPA function      
      instead.

我该如何解决这个问题?我想将新的减去值复制到对角矩阵中。

1 个答案:

答案 0 :(得分:4)

这是一段显示相同错误的简单代码,因此可能有助于澄清问题:

syms x;       % Create symbolic variable
a1 = rand(2); % Floating point array 1
a2 = rand(2); % Floating point array 2
d = a1(1)-x;  % This is now a symbolic expression
a2(1) = d;    % Error: you can't store a symbolic expression in a double array

在R2013b(和R2015b)中返回

The following error occurred converting from sym to double:
Error using mupadmex
Error in MuPAD command: DOUBLE cannot convert the input expression into a double
array.
If the input expression contains a symbolic variable, use the VPA function
instead.
此处不能使用

vpa,因为x是一个尚未定义的符号变量,而不是符号值(vpa(d)具有无关紧要的效果)。

对于您的代码,此行可能会发生错误:

Fix_Diagonal_2(loop2,store)=Diagonal;

您无法使用vpa,因为eigval是一个没有值的符号变量。您可以通过将Fix_Diagonal_2转换为sym来解决您的问题:

Fix_Diagonal_2 = sym(Fix_Diagonal_2);

您可能希望在for循环之外执行此操作。我也不明白为什么你要在外循环的每次迭代中重新定义eigval