我如何知道 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
这确实表明 f1
、f2
等未出现在工作区中。但是,如果您随后分配
>> 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
定义符号向量
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 anm
-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
这确实表明 f1
、f2
等未出现在工作区中。但是,如果您随后分配
>> 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