matlab三维向量,第三维向量的Matlab产品

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值