Multiplying a 2d matrix with each slice of 3d matrix
40 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Søren sønderby
am 1 Aug. 2014
Kommentiert: Ray M
am 13 Okt. 2021
What is the fastest way multiply a 2d matrix with each slice of a 3d matrix?
x = rand(1000,200);
F = rand(100,1000,10);
b = zeros(100,200,10);
for i = 1:10
b(:,:,i) = F(:,:,i)*x;
end
2 Kommentare
Akzeptierte Antwort
Andrei Bobrov
am 2 Aug. 2014
f1 = size(F);
x1 = size(x);
b = reshape(sum(bsxfun(@times,reshape(F,[f1(1),1,f1(2:3)]),...
reshape(x',1,x1(2),[])),3),f1(1),x1(2),[]);
2 Kommentare
Ray M
am 11 Okt. 2021
Great Solution, the solution you have provided is equivalent to:
for i = 1:whatever
b(:,:,i) = F(:,:,i) * x;
end
How would you produce the trasnpose multiplication effect (assuming correct sizes)?
for i = 1:whatever
b(:,:,i) = x * F(:,:,i);
end
Weitere Antworten (4)
Steven Lord
am 11 Okt. 2021
In release R2020b we introduced the pagemtimes function for this purpose.
3 Kommentare
Ray M
am 11 Okt. 2021
Bearbeitet: Ray M
am 11 Okt. 2021
I am not sure if this meant to be a reply to my question under Andrei Bobrov solution, but it does not appear so. I am simply interested in performing a single matrix multiplication by slices of a 3D matrix with the use of bsxfun as follows:
mat_mxn * 3Dmat_nxkxl
and
3Dmat_mxnxk * mat_nxh
Thanks
Steven Lord
am 12 Okt. 2021
@Image Analyst Your bsxfun call is calling times not mtimes. times can work with implicit expansion.
A = int16(magic(4));
B = repmat(A, 1, 1, 3);
C = A.*B
mtimes isn't fully defined for integer arrays. If mtimes doesn't work pagemtimes probably shouldn't.
D = A*A % errors
Edric Ellis
am 4 Aug. 2014
1 Kommentar
Nils Melchert
am 19 Mai 2020
Bearbeitet: Nils Melchert
am 19 Mai 2020
Is there the possibility to get a minimal example for exactly this use case? I am struggling with the same thing.
Image Analyst
am 2 Aug. 2014
You can do it easily if the number of rows and columns in your 3D and 2D match, which they don't in your example:
rows = 1000;
columns = 200;
slices = 10;
x = rand(rows, columns);
F = rand(rows, columns, slices);
b = zeros(rows, columns, slices);
for slice = 1 : slices
b(:,:, slice) = F(:,:, slice) .* x; % Use dot star, not just star.
end
If the number of rows and columns are different you need to make some decisions about exactly where you want to multiply, if one is smaller than the other, or one extends out past the other.
1 Kommentar
Image Analyst
am 2 Aug. 2014
Alternate way. Not sure which is faster:
% Mask the 3D image called "image3D" with 2D image called "mask".
masked3DImage = bsxfun(@times, image3D, cast(mask, class(image3D)));
Siehe auch
Kategorien
Mehr zu GPU Computing finden Sie in Help Center und File Exchange
Produkte
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!