MATLAB: ¿Es posible sobrecargar operadores en construcciones nativas (celdas, estructuras, etc.)?

Estoy usando celdas para administrar datos en algunas cosas en las que estoy trabajando. Me gustaría poder hacer cosas como:

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 );

Sin embargo, no quiero que la sintaxis extremadamente detallada lo haga. Parece un poco exagerado crear una nueva clase para esto cuando todo lo que quiero hacer es proporcionar una definición para los operadores matemáticos en las celdas.

La pregunta: ¿es una clase la única forma de hacerlo?

Si escribo una clase para hacer esto, sin duda hace que sea más fácil escribir el código. Los mayores aspectos negativos que veo están relacionados con las optimizaciones, aunque hay algunas otras cosas que me molestan al respecto ...

Cualquier optimización que ocurra detrás de escena (por ejemplo, cuando Jacket compila algo para ejecutar en una GPU) podría tener más dificultades para determinar qué optimizaciones realizar. Como ejemplo, supongamos que tengo dos celdas (A, B) que contienen varias matrices de dimensión apropiada. Si escribo código para producir una nueva celda:

Z = c1*A + c2*B

... con escalares {c1, c2}, puedo escribirlo de tal manera que Jacket (o lo que sea) determine fácilmente que debe hacer los cálculos como:

Z{kk} = c1*A{kk} + c2*B{kk}

o quizás una optimización aún mejor que eso. De otra manera. puede terminar con algo más lento y / o menos eficiente en la memoria, por ejemplo:

temp1 = cellfun( @(X)( c1*X ), A );
temp2 = cellfun( @(X)( c2*X ), B );
Z     = cellfun( @plus, temp1, temp2 );

sumiendo que MATLAB o Jacket no pueden optimizarlo, esto terminaría usando demasiada memoria.

Respuestas a la pregunta(1)

Su respuesta a la pregunta