我正在使用单元格来管理我正在处理的某些内容中的数据。我希望能够执行以下操作:
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 编译某些东西以在 GPU 上运行时)可能会更难确定要进行哪些优化。例如,假设我有两个单元格 (A,B),其中包含许多适当维度的矩阵。如果我编写代码来生成一个新单元格:
Z = c1*A + c2*B
...使用标量 {c1,c2},我可以这样编写它,使夹克(或其他)可以轻松确定它应该进行以下计算:
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 无法对其进行优化,这最终会占用过多的内存。