我如何知道 syms 向量中的元素是否已分配 (MATLAB)?

How do I know if an element in a syms vector is assigned (MATLAB)?

定义符号向量

f = sym('f', [1 100]);

定义一个syms变量x

syms x

可以访问和分配向量 f 中的元素,例如,

f(i) = x

给定任何 k,那么我如何知道 f(k) 是否已分配?

简答

k为要检查的f条目的索引。然后

isAssigned = ~isempty(whos(char(f(k))));

true(或 1),如果 f 的第 k 个条目已分配并且 false(或 0) 否则。

长答案

来自 documentation(加粗体)

A = sym('a',[m,n]) creates an m-by-n symbolic matrix filled with automatically generated elements. The generated elements do not appear in the MATLAB workspace.

例如,

>> clear all
>> f = sym('f', [1 10])
>> f =
[ f1, f2, f3, f4, f5, f6, f7, f8, f9, f10]
>> whos
  Name      Size            Bytes  Class    Attributes

  f         1x10              112  sym

这确实表明 f1f2 等未出现在工作区中。但是,如果您随后分配

>> syms x;
>> f(3) = x
f =
[ f1, f2, x, f4, f5, f6, f7, f8, f9, f10]

变量x当然出现在工作区中:

>> whos
  Name      Size            Bytes  Class    Attributes

  f         1x10              112  sym                
  x         1x1               112  sym   

因此,检查 f 的特定条目是否已分配的一种方法是使用 whos 的函数形式检查它是否存在于工作区中。比较

>> whos('f2') %// produces no output because no variable f2 exists in the workspace

>> whos('x') %// produces output because variable x exists in the workspace
  Name      Size            Bytes  Class    Attributes

  x         1x1               112  sym                

给定要检查的f条目的索引k,可以自动生成对应的字符串(上例中的'f2''x')使用 char(f(k)):

>> k = 2;
>> char(f(k))
ans =
f2

>> k = 3;
>> char(f(k))
ans =
x    

只剩下将whos(char(f(k)))的输出赋值给一个变量,f(k)没有赋值则为空,赋值则为非空:

>> k = 2;
>> t = whos(char(f(k)))
t = 
0x1 struct array with fields:
    name
    size
    bytes
    class
    global
    sparse
    complex
    nesting
    persistent

>> k = 3;
>> t = whos(char(f(k)))
t = 
          name: 'x'
          size: [1 1]
         bytes: 112
         class: 'sym'
        global: 0
        sparse: 0
       complex: 0
       nesting: [1x1 struct]
    persistent: 0

因此,如果 f 的第 k 个条目具有已分配且 false (0) 否则:

>> k = 2;
>> isAssigned = ~isempty(whos(char(f(k))))
isAssigned =
     0

>> k = 3;
>> isAssigned = ~isempty(whos(char(f(k))))
isAssigned =
     1