EDIT (benchmark): Ponieważ kilka rozwiązań (w tym kopalni poniżej) zostały zaproponowane, tu jest jakiś szorstki benchmarking porównać różne rozwiązania, używając większych tablic:
a=1:10;
N=1000; timers=zeros(N,6);
for ii=1:N; C=rand(400);
tic; out = repmat(C,[1,1,numel(a)]).*reshape(repelem(a,size(C,1),size(C,2)),[size(C),numel(a)]); timers(ii,1)=toc;
tic; out = bsxfun(@times,C,reshape(a,1,1,[])); timers(ii,2)=toc;
tic; out = reshape(C(:)*a, size(C,1), size(C,2), numel(a)); timers(ii,3)=toc;
tic; out = bsxfun(@mtimes,C,permute(a,[3,1,2])); timers(ii,4)=toc;
tic; out = reshape(bsxfun(@mtimes, C(:), a(:).'), [size(C),numel(a)]); timers(ii,5)=toc;
tic; out = reshape(kron(a,C),[size(C),numel(a)]); timers(ii,6)=toc;
end;
mean(timers)
ans =
0.0080863 0.0032406 0.0041718 0.015166 0.0074462 0.0033051
... sugeruje, że Rozwiązanie @hbaderts jest najszybsze, następnie @ Adiel, następnie @Luis Mendo, następnie @ thewaywewalk's (1), następnie moje, następnie @ thewaywewalk's (2).
Moje rozwiązanie:
Inną opcją, używając repmat
i reshape
(bez bsxfun
):
out = repmat(C,[1,1,numel(a)]).*reshape(repelem(a,size(C,1),size(C,2)),[size(C),numel(a)])
out(:,:,1) =
1 2 3
4 5 6
7 8 9
out(:,:,2) =
2 4 6
8 10 12
14 16 18
Jest to element mnożenie dwóch macierzy. Pierwszym jest oryginalna matryca C
powtarzane numel(a)
razy w trzecim wymiarze:
repmat(C,[1,1,numel(a)])
ans(:,:,1) =
1 2 3
4 5 6
7 8 9
ans(:,:,2) =
1 2 3
4 5 6
7 8 9
drugi jest tego samego rozmiaru jak pierwsza, przy czym każdy plaster zawierający odpowiedni element a
:
reshape(repelem(a,size(C,1),size(C,2)),[size(C),numel(a)])
ans(:,:,1) =
1 1 1
1 1 1
1 1 1
ans(:,:,2) =
2 2 2
2 2 2
2 2 2
Would not 'permute' być bardziej odpowiednie niż' przekształcić "tutaj? – Dan