示例:
>> A = table({}, {}, {}, {}, {}, ...
'VariableNames', {'Foo', 'Bar', 'Baz', 'Frobozz', 'Quux'});
>> vn = A.Properties.VariableNames;
>> isequal(vn, A.Properties.VariableNames)
ans =
1
到目前为止一切顺利,但即使vn
和A.Properties.VariableNames
看起来相同,但当他们尝试从中获取“以逗号分隔的列表”时,它们的行为也会大不相同(使用{{ 1}}):
{:}
有没有办法直接从A.Properties.VariableNames 获取“以逗号分隔的列表”(也就是说,无需创建像>> {'Frobnitz', vn{:}}
ans =
'Frobnitz' 'Foo' 'Bar' 'Baz' 'Frobozz' 'Quux'
>> {'Frobnitz', A.Properties.VariableNames{:}}
ans =
'Frobnitz' 'Foo'
这样的中间变量)? / p>
(另外,是否有比vn
更可靠的函数来测试单元格数组的相等性?在上面的示例中,isequal
和vn
显然不够相等< / EM>!)
对于那些没有支持(而非新的)A.Properties.VariableNames
对象的MATLAB版本的人来说,如果使用table
对象(来自统计工具箱),则会出现同样的情况。上面的例子将转换为:
dataset
(注意从clear('A', 'vn');
A = dataset({}, {}, {}, {}, {}, ...
'VarNames', {'Foo', 'Bar', 'Baz', 'Frobozz', 'Quux'});
vn = A.Properties.VarNames;
isequal(vn, A.Properties.VarNames)
{'Frobnitz', vn{:}}
{'Frobnitz', A.Properties.VarNames{:}}
到VariableNames
的变化;省略输出:它与上面显示的输出相同):
答案 0 :(得分:2)
isequal
没问题。 vn
和A.Properties.VariableNames
实际上是平等的。问题是别的......
如果您输入help dataset.subsref
,您将获得解释原因的原因,这与[{1}}类的解释相同:
限制:
table
简而言之,当您调用行 Subscripting expressions such as A.CellVar{1:2}, A.StructVar(1:2).field,
or A.Properties.ObsNames{1:2} are valid, but result in subsref
returning multiple outputs in the form of a comma-separated list. If
you explicitly assign to output arguments on the LHS of an assignment,
for example, [cellval1,cellval2] = A.CellVar{1:2}, those variables will
receive the corresponding values. However, if there are no output
arguments, only the first output in the comma-separated list is
returned.
时,您正在调用A.Properties.VarNames{:}
方法,并且正在将大括号下标dataset.subsref
与其一起传递给它其他{:}
下标,而不是在调用.
方法后单独应用。
因此,如果不使用中间变量,您可以直接从dataset.subsref
获取逗号分隔列表。但是,如果您的目标(如您的示例中所示)是将字符串与另一个字符串连接到一个新的单元格数组中,您可以这样做:
A
答案 1 :(得分:2)
不,除了创建临时变量vn之外,我认为你无能为力。长期以来一直是用户定义类的一个令人不安的缺点,他们无法用逗号分隔列表扩展。但我觉得奇怪的是,TMW选择在用户定义的类框架中实现table
类。
至于isequal
,那里没有问题。您看到的行为与vn和A.Properties.VariableNames不相等无关。