如何直接从table.Properties.VariableNames获取逗号分隔列表?

时间:2014-02-03 16:49:28

标签: matlab

示例:

>> A = table({}, {}, {}, {}, {}, ...
             'VariableNames', {'Foo', 'Bar', 'Baz', 'Frobozz', 'Quux'});
>> vn = A.Properties.VariableNames;
>> isequal(vn, A.Properties.VariableNames)
ans =

 1

到目前为止一切顺利,但即使vnA.Properties.VariableNames看起来相同,但当他们尝试从中获取“以逗号分隔的列表”时,它们的行为也会大不相同(使用{{ 1}}):

{:}

有没有办法直接从A.Properties.VariableNames 获取“以逗号分隔的列表”(也就是说,无需创建像>> {'Frobnitz', vn{:}} ans = 'Frobnitz' 'Foo' 'Bar' 'Baz' 'Frobozz' 'Quux' >> {'Frobnitz', A.Properties.VariableNames{:}} ans = 'Frobnitz' 'Foo' 这样的中间变量)? / p>

(另外,是否有比vn更可靠的函数来测试单元格数组的相等性?在上面的示例中,isequalvn显然不够相等< / 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的变化;省略输出:它与上面显示的输出相同):

2 个答案:

答案 0 :(得分:2)

isequal没问题。 vnA.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不相等无关。