2014-02-03 3 views
4

Пример:Как получить список, разделенный запятой, непосредственно из table.Properties.VariableNames?

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

1 

До сих пор так хорошо, но даже несмотря на vn и A.Properties.VariableNames по всей видимости, то же самое, что они ведут себя совсем по-другому, когда один пытается получить «разделенный запятыми список» из них (с помощью {:}) :

>> {'Frobnitz', vn{:}} 

ans = 

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

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

ans = 

    'Frobnitz' 'Foo' 

есть ли способ, чтобы получить «разделенный запятыми список» из A.Properties.VariableNames непосредственно (то есть, без того, чтобы создать промежуточную переменную типа vn)?

(Кроме того, есть более надежные функции, чем isequal для проверки равенства клеточных массивов? В приведенном выше примере vn и A.Properties.VariableNames явно не равно достаточно!)


Для тех, кто не У меня есть версия MATLAB, которая поддерживает (довольно новые) объекты table, это одна и та же история, если вместо этого использовать объекты dataset (из панели инструментов Statistics). В приведенном выше примере будет затем перевести:

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 к VarNames; выход опущена: это совпадает с выходом, показанной выше):

ответ

2

Там нет никаких проблем с isequal. vn и A.Properties.VariableNames фактически равны. Проблема в том, что-то еще ...

Если вы наберете help dataset.subsref, вы получите объяснение того, почему это происходит, что должно быть такое же объяснение, как для 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 без использования промежуточной переменной. Однако, если ваша цель (как в вашем примере), чтобы сцепить строки вместе с другой строкой в ​​новый массив ячеек, вы можете сделать это:

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

ans = 

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

Нет, я не думаю, что есть что-то вы можете do, кроме создания временной переменной vn. Долгое время был неприятный недостаток пользовательских классов, что они не могут выполнять расширение списка, разделенное запятыми. Однако мне кажется странным, что TMW решила реализовать класс table в пользовательской структуре классов.

Что касается isequal, проблем нет. Поведение, которое вы видите, не имеет ничего общего с vn и A.Properties.VariableNames не равны.

Смежные вопросы