Nếu A
là đúng mảng 3D, giống như A = rand(4,10,3)
và giả định rằng B
vẫn là một mảng 2D, sau đó mỗi A(:,:,1)*B
sẽ mang lại một mảng 2D.
Vì vậy, giả định rằng bạn muốn lưu trữ những mảng 2D như lát trong chiều thứ ba của mảng đầu ra, C
như vậy -
C(:,:,1) = A(:,:,1)*B;
C(:,:,2) = A(:,:,2)*B;
C(:,:,3) = A(:,:,3)*B; and so on.
Để giải quyết việc này một cách vectorized, một trong những cách tiếp cận sẽ là sử dụng định dạng lại A
thành mảng 2D kết hợp thứ nguyên đầu tiên và thứ ba và sau đó thực hiện ma trận-muliplication. Cuối cùng, để mang lại kích thước đầu ra giống như trước đó được liệt kê C
, chúng ta cần một bước cuối cùng của định hình lại.
Việc thực hiện sẽ giống như thế này -
%// Get size and then the final output C
[m,n,r] = size(A);
out = permute(reshape(reshape(permute(A,[1 3 2]),[],n)*B,m,r,[]),[1 3 2]);
mẫu chạy -
>> A = rand(4,10,3);
B = rand(10,16);
C(:,:,1) = A(:,:,1)*B;
C(:,:,2) = A(:,:,2)*B;
C(:,:,3) = A(:,:,3)*B;
>> [m,n,r] = size(A);
out = permute(reshape(reshape(permute(A,[1 3 2]),[],n)*B,m,r,[]),[1 3 2]);
>> all(C(:)==out(:)) %// Verify results
ans =
1
Theo comments
, nếu A
là một mảng 3D với luôn luôn là một chiều kích singleton tại bắt đầu, bạn chỉ có thể sử dụng squeeze
và sau đó nhân ma trận như vậy -
C = B.'*squeeze(A)
Điều gì xảy ra nếu 'A = rand (4,10,3)', đó là mảng '3D' không có kích thước đơn? Điều gì phải là đầu ra sau đó? – Divakar
@Divakar Nó luôn luôn đơn giản trong vấn đề của tôi. –
Trong trường hợp đó, chỉ cần 'squeeze'' A' và sử dụng phép nhân ma trận - 'C = B. '* Squeeze (A)'. – Divakar