Ответ 1
Фактически возможно создавать новые операторы или перегружать существующие для встроенных типов данных в MATLAB. Я опишу один пример этого в моем ответе на другой вопрос о изменении поведения переполнения по умолчанию для целых типов.
Во-первых, вы можете посмотреть, какие методы существуют в настоящее время для массивов ячеек. Вы можете сделать это, используя функцию METHODS, и вот что я получаю в MATLAB R2010b:
>> methods cell
Methods for class cell:
aa2nt issorted regexptranslate strfind
accumarray newdepfun reshape strjust
cell2struct nt2aa rna2dna strmatch
ctranspose nwalign seq2regexp strtok
display permute setdiff transpose
dna2rna regexp setxor union
intersect regexpi sort unique
ismember regexprep strcat
Арифметические операторные методы будут отображаться в приведенном выше списке как их эквиваленты функций , например plus
для оператора +
или times
для оператора .*
. Для массивов ячеек определен только метод transpose
(.'
). Вам нужно было бы создать остальное самостоятельно, определяя, как данный оператор будет вести себя для аргументов массивов ячеек.
Вы можете сделать это, сначала создав новую папку под названием @cell
и поместив ее в существующую папку на путь MATLAB. Затем вы разместите свои новые методы в папке @cell
. Например, очень простая реализация метода plus
для массивов ячеек (без проверки ввода, проверки ошибок и т.д.) Была бы такой:
function C = plus(A,B)
C = cellfun(@plus,A,B,'UniformOutput',false); %# Apply plus cell-wise
end
В приведенном выше коде вы, вероятно, сначала захотите проверить, что операнды A
и B
являются массивами ячеек одинакового размера. Однако вы можете создать любую уникальную функциональность, например, позволить B
быть скалярным значением, которое будет добавлено в каждую ячейку A
. Это полностью зависит от вас, чтобы определить, как оператор +
будет вести себя для массивов ячеек.
Это позволило бы вам написать свой код гораздо более компактным образом, как в этом примере:
>> A = {[1 2 3] [4 5] 6}; %# One 3-element cell array
>> B = {5 [4 5] 2}; %# Another 3-element cell array
>> C = A+B; %# Use the new plus operator
>> C{:} %# Display the cell contents
ans =
6 7 8
ans =
8 10
ans =
8
Я не могу говорить с закулисной оптимизацией и как это может повлиять на них. Я знаю, что документация "Методы повышения производительности" специально упоминает об этом перегрузка встроенных функций:
Перегрузка встроенных функций MATLAB по любой из стандартных данных MATLAB классы могут отрицательно повлиять представление. Например, если вы перегрузите функцию
plus
для обработки любой из целых классов иначе вы можете помешать определенным оптимизация в встроенном MATLAB функциональный код дляplus
, и, следовательно, может замедлить работу любых программ, которые используют этой перегрузки.
Однако в вашем случае вы не перегружаете существующие функции для класса. Вы просто создаете новые, которые не существовали для этого класса, поэтому трудно сказать, какой эффект это может в конечном итоге повлиять на производительность.