我正在使用单元格来管理一些工作中的数据。我希望能够做到以下几点:
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} 的向量,我可以这样写它,让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无法进行优化,那么这将会使用过多的内存。