6

cell(1, n)と呼ばれるセル配列がありA、各セルエントリにはの行列が含まれていmxnます。したがって、実際には、私のセル配列にnはサイズの行列が含まれていますmxn

B次に、n pxm行列が格納された、という別のセル配列があります。

私がする必要があるのは、、、、 ...、A[1] * B[1]のように、2つを互いに乗算することです。次に、結果を独自の個別の行列として保存し、それらを合計する必要があります。A[2] * B[2]A[n] * B[n]

行列は乗算に対して等角ですが、セル配列Bにはセル配列よりも少ない行が含まれているため、A使用するcellfun(@times A, B, 'UniformOutput', true)unequal matricesエラーが発生します。

cellfunこれは、行列の行と列の数が等しい場合にのみ、個々のセルを乗算できることを示しているようです。

これで、さまざまなループを使用したり、andを呼び出したりすることでこれを実行できcell2matますmat2cell。セルを使用するのではなく、すべてを行列配列として格納することもできます...しかし-セルを使用したいと思います。

だから-私の質問は:これを行うのに良い方法はありcellfunますか?私はすでに引数入力のさまざまな組み合わせを試しましたが、今のところ運がありません。

4

2 に答える 2

2

でこれを行うにはcellfun、独自の無名関数を定義するだけです。

C = cellfun(@(a,b) a*b, A, B, 'UniformOutput', 0);

さて、あなたが質問をしたとき、内側の寸法が一致しないため、A*Bを掛けることはできません。代わりに、私はこれをB * Aでテストしました。ここで、寸法は一致しています:p = 1、m = 3、n=3。

A = {eye(3), rand(3), magic(3)};
B = {[1 2 3], [3 5 1], [7 8 8]};

C = cellfun(@(a,b) b*a, A, B, 'UniformOutput', 0);

Cmat = cat(3, C{:});
S = sum(Cmat, 3);

C合計は、3次元以上の各配列を連結し、それを合計することによって行われます。

于 2012-12-01T00:24:26.287 に答える
2

はい、引数は同じサイズである必要があります。差出人help cellfun

A = cellfun(FUN、B、C、...)は、セル配列B、C、...のセルの内容を入力引数として使用してFUNを評価します。Aの(I、J、...)番目の要素はFUN(B {I、J、...}、C {I、J、...}、...)と同じです。B、C、...はすべて同じサイズである必要があります。

したがって、ループを使用するか、呼び出す前に、要素の数が多いセルから余分な要素を削除してくださいcellfun

% assuming B has more elements than A
B(numel(A)+1:end) = [];
于 2012-12-01T09:32:51.047 に答える