Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可以在MATLAB中对其进行优化以使其运行更快吗?_Matlab_Loops_Optimization_Vectorization - Fatal编程技术网

可以在MATLAB中对其进行优化以使其运行更快吗?

可以在MATLAB中对其进行优化以使其运行更快吗?,matlab,loops,optimization,vectorization,Matlab,Loops,Optimization,Vectorization,这是密码 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); 也许有办法把它矢量化 顺便说一句,shape和shape是由0和1组成的数组,因此它们可以以某种方式用作逻

这是密码

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);
也许有办法把它矢量化

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

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
这里还有一个解决方案-

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

输入的典型尺寸是什么?对于[AB c]大小的形状,视觉应该是[AB d]大小?那么前两个维度在大小上是匹配的?输入的典型尺寸是什么?对于大小[abc]的形状,视觉应该是大小[abd]?那么,前两个维度的大小是否匹配?