2016-01-05 2 views
0

Я хочу добавить метод nansubset в класс table. По сути, это позволяет вам позвонить по телефону T(r,c) где r и c - положительные целые числа, которые могут содержать NaN.Добавить метод в класс таблицы Matlab

погасил код nansubset.m может быть:

function T = nansubset(T, r, c) 
T = T(r,c); 
end  

Я следую инструкциям here, которые подробно, как добавить новый метод к cell класса. В основном, в папке на моем пути Matlab, я создаю папку с именем @table, и в этой папке создайте файл с именем nansubset.m.

Я получаю следующие проблемы:

>> tmpT = table(); nansubset(tmpT, 1, 1) 
Undefined function 'nansubset' for input arguments of type 'table'. 

и

>> doc @table/nansubset 
Your search - @table/nansubset - did not match any documents. 

Однако:

edit nansubset 

и

edit @table/nansubset 

оба открывают файл метода в моем редакторе.

Далее, следуя инструкциям в приведенной выше ссылке, необходимо добавить метод plus в класс cell и найти, что он отлично работает.

Может кто-нибудь, пожалуйста, объясните мне, как я могу добавить этот дополнительный метод к классу table?

+0

Я перезагрузил мою MatLab сессию и получил это: 'Ошибка при помощи таблицы/nansubset Ранее доступный файл "C: \ Program Files \ MATLAB \ R2015b \ Панели инструментов \ MATLAB \ типов данных \ @table \ nansubset.m" является теперь недоступно ». Это было после того, как я переместил файл' nansubset.m' на мой путь matlab как автономную функцию, как это предложил @TroyHaskin. – Alex

ответ

3

С выпуском Matlab R2012b (версия 8), the class folder behavior changed (акцент мой):

В MATLAB версий 5 по 7, папки классов не теневые другие папки класса с тем же именем, но они находятся в папках с более поздними путями. Вместо этого класс сочетает в себе методы из всех папок классов с одинаковым именем. Это больше не действительное.

Для обратной совместимости классы , определенные в папках классов, всегда имеют приоритет над функциями и сценариями с таким же именем, даже те, которые находятся перед ними на пути.

Сочетание двух смелых заявлений объясняет поведение:

  • cell является встроенным Matlab функции, которая предшествует новые правила объектно-ориентированного программирования, который возвращает экземпляр этого класса. И до R2012b добавление методов в папку класса с именем @cell добавило методы к объекту, возвращенному из функции cell (который не определен с помощью classdef или папки класса); эта способность была сохранена для совместимости с устаревшим кодом пользователя.
  • table был добавлен после R2012b, определяется через папку классов и является Sealed. Так как это Sealed, он не может быть подклассифицирован. И с новыми правилами любая папка @table без связанного с ней файла classdef не будет регистрироваться как папка класса, и ее методы не будут скомпонованы в существующий класс, если она не является частью старой системы (например, cell).

Я вижу три обходные пути, перечисленные в порядке, я думаю, что лучше:

  1. Имейте функцию на пути Matlab, так же, как тот, который вы имеете, и всегда называют «метод», используя функцию вместо точечной нотации. Если вам нужно больше «методов», группируйте их в папке или пакете (если требуется хорошее пространство имен) на пути. Поскольку table - класс значений, этот параметр не выглядит плохим.
  2. Создайте класс обертки, как показано ниже. Это громоздко, но автоматически инкапсулирует дополнительные функции.

    classdef MyTable < handle 
    
        properties 
         tab; 
        end 
    
        methods 
         function mytab = MyTable(varargin) 
          mytab.tab = table(varargin{:}); 
         end 
         function tabnan = nansubset(mytab,r,c) 
          tabnan = mytab.tab(r,c); 
         end 
        end 
    end 
    
  3. Создайте локальную копию [matlabroot,'\toolbox\matlab\datatypes\@table\*'] и добавьте методы непосредственно. Я не могу придумать каких-либо серьезных недостатков в этом, но он чувствует странное копирование внутренних компонентов, подобных этому.
+1

Вау, большое спасибо за расследование, которое привело к этому. По сути, в качестве обходного пути я думаю, что я реализовал вариант 1), как вы предлагаете. Я добавляю дополнительную строку: 'if istable (T); ...; end', где '...' представляет код для подмножества таблицы 'T'. – Alex

+0

Означает ли это, что невозможно добавить метод к родному классу matlab, за исключением использования опции 3? Если я правильно понимаю, из ваших решений только вариант 3) создает класс 'table', содержащий новый метод. (Я также попытался добавить файл nansubset.m в '' \ toolbox \ matlab \ datatypes \ @table \ * '', но это тоже не сработало). – Alex

+0

@Alex Я бы сказал, что это означает, что встроенный тип 'btype', введенный в релиз R2012b или после него, не будет иметь функций, перечисленных в папке' @ btype', добавленных в список методов после создания. Он работает для 'cell' и' struct', и потому, что эти типы предшествуют R2012b множеством. – TroyHaskin

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