Я использую ячейки для управления данными в некоторых материалах, над которыми я работаю. Я хотел бы иметь возможность делать такие вещи, как:
A = cellfun( @(X)( randn( 5,5 ) ), cell( 5,1 ), 'UniformOutput', 0 );
B = cellfun( @(X)( randn( 5,5 ) ), cell( 5,1 ), 'UniformOutput', 0 );
%#
%# Each of the following would fail if cell member dimensions
%# don't match up
%#
%# matrix sums for each cell entry
%# C = A + B;
C = cellfun( @(X,Y)( X + Y ), A, B, 'UniformOutput', 0 );
%#
%# direct/hadamard product
%# D = A .* B;
D = cellfun( @(X,Y)( X .* Y ), A, B, 'UniformOutput', 0 );
%#
%# matrix-matrix products (not across all entries)
%# E = A * B;
E = cellfun( @(X,Y)( X * Y ), A, B, 'UniformOutput', 0 );
Однако я не хочу, чтобы это был очень подробный синтаксис. Кажется, немного за бортом, чтобы создать новый класс для этого, когда все, что я хочу сделать, это дать определение для математических операторов на ячейках.
Вопрос: Является ли класс единственным способом для этого?
Если я пишу класс для этого, это, безусловно, упрощает запись кода. Самые большие негативы, которые я вижу, связаны с оптимизацией, хотя есть несколько других вещей, которые меня обманывают.
Любая оптимизация, идущая за кулисами (например, когда Jacket компилирует что-то для работы на графическом процессоре), потенциально может быть сложнее определить, какие оптимизации делать. В качестве примера предположим, что у меня есть две ячейки (A, B), содержащие несколько матриц соответствующей размерности. Если я пишу код для создания новой ячейки:
Z = c1*A + c2*B
... со скалярами {c1, c2}, я могу записать его таким образом, что Jacket (или что-то еще) легко определит, что он должен делать вычисления как:
Z{kk} = c1*A{kk} + c2*B{kk}
или, возможно, даже лучше, чем оптимизация. В противном случае. это может привести к чему-то более медленному и/или меньшему эффективному использованию памяти, например:
temp1 = cellfun( @(X)( c1*X ), A );
temp2 = cellfun( @(X)( c2*X ), B );
Z = cellfun( @plus, temp1, temp2 );
Предполагая, что MATLAB или Jacket не могут его оптимизировать, это приведет к чрезмерному использованию памяти.