セルを使用して、作業中のデータを管理しています。次のようなことができるようになりたいです。
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で実行するために何かをコンパイルするとき)は、どの最適化を行うかを決定するのに苦労する可能性があります。例として、適切な次元の行列をいくつか含む2つのセル(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がそれを最適化できないと仮定すると、これはメモリを過剰に使用することになります。