gpt4 book ai didi

三维向量的 Matlab 乘积

转载 作者:太空宇宙 更新时间:2023-11-03 19:54:01 25 4
gpt4 key购买 nike

我希望我的问题有一个非常简单的解决方案。我只是找不到它:

假设您有两个向量(一个是列向量,一个是行向量)A、B:

A = [1,2,3]
B = [4;5;6]

如果我们按如下方式将它们相乘,我们会得到一个矩阵:

>> B*A
ans =
4 8 12
5 10 15
6 12 18

现在我的问题是:我有两个 3D 矩阵,大小分别为 m × n × pm × n × q

想象一下沿维度 mn 我们有像素,对于每个像素我们有一个向量(长度 p 或 q)。现在我想要的是将两个图像的向量相乘,这样对于每个像素我都得到一个矩阵,因此总共有一个 4D 矩阵结束。

我如何有效地做到这一点?

最佳答案

Matlab 中的循环不再是一件令人恐惧的事情,或者本身

诚然,使用它们时应格外小心,但尽管如此,JIT 可以处理多种循环,甚至可以提高内置函数以外的性能。

考虑以下测试用例:

clc

m = 512; n = 384;
p = 5; q = 3;

A = rand(m,n,p); % some sample data
B = rand(m,n,q); % some sample data

%% non-loop approach

tic
A2 = reshape(A,[],p);
B2 = reshape(B,[],q);
C2 = arrayfun(@(ii) A2(ii,:)'*B2(ii,:),1:m*n,'uni',false);
C0 = permute(reshape(cell2mat(C2),p,q,m,n),[3 4 1 2]);
toc

%% looped approach, simplest

tic
C = zeros(m,n,p,q);
for mm = 1:m
for nn = 1:n
C(mm,nn,:,:) = ...
squeeze(A(mm,nn,:))*squeeze(B(mm,nn,:)).';
end
end
toc

% check for equality
all(C0(:) == C(:))

%% looped approach, slightly optimized

tic
C = zeros(m,n,p,q);
pp = zeros(p,1);
qq = zeros(1,q);
for mm = 1:m
for nn = 1:n
pp(:) = A(mm,nn,:);
qq(:) = B(mm,nn,:);
C(mm,nn,:,:) = pp*qq;
end
end
toc

% check for equality
all(C0(:) == C(:))

%% looped approach, optimized

tic
C = zeros(p,q,m*n);
A2 = reshape(A,[],p);
B2 = reshape(B,[],q);
for mn = 1:m*n
C(:,:,mn) = A2(mn,:).'*B2(mn,:);
end
C = permute(reshape(C, p,q,m,n), [3,4,1,2]);
toc

% check for equality
all(C0(:) == C(:))

结果:

Elapsed time is 3.955728 seconds.
Elapsed time is 21.013715 seconds.
ans =
1
Elapsed time is 1.334897 seconds.
ans =
1
Elapsed time is 0.573624 seconds.
ans =
1

无论性能如何,我还发现最后一种情况比非循环情况更直观和可读。

关于三维向量的 Matlab 乘积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11691079/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com