【问题标题】:Can this be optimized to run faster in MATLAB?这可以优化为在 MATLAB 中运行得更快吗?
【发布时间】:2016-02-19 05:40:46
【问题描述】:

这里是代码

S = size(shape,3)
shape = 1 - shape;

for i = 2:S
    SHAPE = prod(shape(:,:,1:i-1),3);
    for c = 1:3
        vision(:,:,c,i) = vision(:,:,c,i).*SHAPE;
    end
end

output = sum(vision,4);

也许有办法对其进行矢量化?

顺便说一句,shapeSHAPE 是由 0 和 1 组成的数组,因此它们可以以某种方式用作逻辑。

【问题讨论】:

  • 输入的典型尺寸是多少?
  • 对于大小为 [a b c] 的形状,视觉的大小为 [a b d]?那么前两个维度的大小匹配吗?

标签: matlab loops optimization vectorization


【解决方案1】:

这里有一个 更多 bsxfun 解决方案 -

S = size(shape,3);
shape = 1 - shape;

SHAPE = cumprod(shape(:,:,1:S-1),3);
vision(:,:,1:3,2:S) = bsxfun(@times,vision(:,:,1:3,2:S),permute(SHAPE,[1 2 4 3]));
output = sum(vision,4);

测试

由于代码具有vision(:,:,c,i) 并且迭代器c 来自c = 1:3,因此vision 的第三维很可能是3。为了验证提议的方法是否适用,我们将其保留为5。此外,为了进行适当的基准测试,让我们在其他维度上使用大数字,并在其中使用随机数。为了验证,最后我们会找到提议的方法和原始方法的输出之间的绝对最大差异。

基准测试和输出验证码-

% Inputs
shape = rand(150,160,170);
vision = rand(150,160,5,170);
shape = 1 - shape;
S = size(shape,3);

%// Proposed solution :
disp('----------------------- With Proposed solution')
tic
V = vision;   %// Make a copy for using with proposed solution
SHAPE = cumprod(shape(:,:,1:S-1),3);
V(:,:,1:3,2:S) = bsxfun(@times,V(:,:,1:3,2:S),permute(SHAPE,[1 2 4 3]));
out = sum(V,4);
toc

%// Original solution :
disp('----------------------- With Original solution')
tic
S = size(shape,3);
for i = 2:S
    SHAPE = prod(shape(:,:,1:i-1),3);
    for c = 1:3
        vision(:,:,c,i) = vision(:,:,c,i).*SHAPE;
    end
end
output = sum(vision,4);
toc

error_value = max(abs(output(:) - out(:)))

命令输出 -

----------------------- With Proposed solution
Elapsed time is 0.802486 seconds.
----------------------- With Original solution
Elapsed time is 4.401897 seconds.
error_value =
     0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-09-30
    • 2012-06-27
    • 2013-12-22
    • 1970-01-01
    • 2020-01-13
    • 2013-10-03
    • 2020-04-26
    相关资源
    最近更新 更多