EDIT (benchmarking): Dato che diverse soluzioni (compreso il mio) di seguito sono state suggerite, ecco alcune analisi comparativa di massima per confrontare le diverse soluzioni, utilizzando gli array più grandi:
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
... suggerendo che La soluzione @hbaderts è la più veloce, quindi @ Adiel's, poi @Luis Mendo's, poi @ thewaywewalk's (1), poi la mia, poi @ thewaywewalk's (2).
mia soluzione:
Un'altra opzione, utilizzando repmat
e reshape
(senza 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
Questa è la moltiplicazione elemento-saggio di due array. Il primo e il matrice originale C
ripetuto numel(a)
volte nella terza dimensione:
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
Il secondo è la stessa dimensione come prima, con ogni fetta contenente l'elemento corrispondente 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
Non sarebbe 'permute' essere più adatto di' rimodellare qui? – Dan