例子:

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

 1

到目前为止一切顺利,但即使 vnA.Properties.VariableNames 看起来相同,当人们试图从它们(使用 {:} )获取“逗号分隔列表”时,它们的行为却大不相同:
>> {'Frobnitz', vn{:}}

 ans =

     'Frobnitz'    'Foo'    'Bar'    'Baz'    'Frobozz'    'Quux'

>> {'Frobnitz', A.Properties.VariableNames{:}}

 ans =

     'Frobnitz'    'Foo'

有没有办法直接从 A.Properties.VariableNames 获取“逗号分隔列表”(即,无需创建像 vn 这样的中间变量)?

(此外,是否有比 isequal 更可靠的函数来测试单元格数组的相等性?在上面的示例中,vnA.Properties.VariableNames 显然不够相等!)

对于那些没有支持(相当新的) table 对象的 MATLAB 版本的人,如果使用 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{:}}

(注意从 VariableNamesVarNames 的变化;省略了输出:它与上面显示的输出相同):

最佳答案

isequal 没有问题。 vnA.Properties.VariableNames 实际上是相等的。问题是别的...

如果你输入 help dataset.subsref ,你会得到一个解释为什么会发生这种情况,这应该与 table 类的解释相同:



简而言之,当您调用 A.Properties.VarNames{:} 行时,您正在调用 dataset.subsref 方法,并且花括号下标 {:} 正与其他 . 下标一起传递给它,而不是在调用之后单独应用dataset.subsref 方法。

因此,在不使用中间变量的情况下,您似乎无法直接从 A 获取逗号分隔的列表。但是,如果您的目标(如您的示例中所示)是将字符串与另一个字符串连接到一个新的元胞数组中,则可以执行以下操作:

>> [{'Frobnitz'} A.Properties.VarNames]

ans =

    'Frobnitz'    'Foo'    'Bar'    'Baz'    'Frobozz'    'Quux'

关于matlab - 如何直接从 table.Properties.VariableNames 获取逗号分隔的列表?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21532915/

10-12 22:31