8

私はMATLABにかなり慣れていません。M x K 行列と K x N 行列の通常の行列乗算 -- C = A * B-- はc_ij = sum(a_ik * b_kj, k = 1:K)です。c_ij = sum(op(a_ik, b_kj), k = 1:K)これを単純なバイナリ操作の代わりにしたい場合はどうすればよいopですか? これを MATLAB (または組み込み関数) でベクトル化する良い方法はありますか?

編集:これは現在私ができる最善のことです。

% A is M x K, B is K x N
% op is min
C = zeros(M, N);
for i = 1:M:
    C(i, :) = sum(bsxfun(@min, A(i, :)', B));
end
4

4 に答える 4

2

この投稿にリストされているのは、元の投稿のループを本質的に置き換えるために、必要に応じてシングルトン次元を作成するためbsxfunに使用するベクトル化されたアプローチです。はメモリを大量に消費する実装であるため、拡張しすぎるまで高速化を期待しないでください。これが最終的なソリューションコードです-permutebsxfunsingleton-expansionbsxfun

op = @min;   %// Edit this with your own function/ operation
C = sum(bsxfun(op, permute(A,[1 3 2]),permute(B,[3 2 1])),3)

NB - 上記のソリューションは、Matlab の入れ子になった 4 つのループを削除することに触発されました。

于 2014-06-14T17:14:18.807 に答える
1

オペレーターが要素ごとに操作できる場合 ( のように.*):

if(size(A,2)~=size(B,1))
    error(blah, blah, blah...);
end

C = zeros(size(A,1),size(B,2));
for i = 1:size(A,1)
    for j = 1:size(B,2)
        C(i,j) = sum(binaryOp(A(i,:)',B(:,j)));
    end
end
于 2011-11-09T00:12:13.357 に答える
0

特定のニーズに応じて、3D で bsxfun を使用して二項演算子をだますことができる場合があります。詳細については、この回答を参照し て ください

于 2014-06-14T16:10:30.653 に答える
0

ループはいつでも自分で書くことができます:

A = rand(2,3);
B = rand(3,4);

op = @times;            %# use your own function here
C = zeros(size(A,1),size(B,2));
for i=1:size(A,1)
    for j=1:size(B,2)
        for k=1:size(A,2)
            C(i,j) = C(i,j) + op(A(i,k),B(k,j));
        end
    end
end

isequal(C,A*B)
于 2011-11-08T23:41:40.067 に答える