mysql matlab for循环嵌套循环_数组 – 嵌套for循环在MATLAB中非常慢(预分配)

博主在尝试使用MATLAB处理4维数组,进行背景计算时遇到了性能问题。他们分享了包含四个嵌套循环的代码,发现运行速度较慢。尽管尝试了预分配和使用索引获取数据,但速度仍不理想。通过社区的帮助,了解到MATLAB的单行表达式可以显著提高性能。博主寻求理解为何嵌套循环在MATLAB中运行缓慢,并询问是否有方法能优化这类循环以接近C语言的效率,或者是否应接受MATLAB中更简洁的高性能编程风格。
摘要由CSDN通过智能技术生成

我正在尝试学习MATLAB,我遇到的第一个问题是用静态相机和移动物体来猜测图像序列的背景.首先,我只是想在一段时间内对像素进行均值或中值,所以它只是我想要应用于4维数组的一行的单个函数.

我已将RGB图像加载到具有以下尺寸的4维阵列中:

uint8 [ num_images, width, height, RGB ]

这是我写的函数,包括4个嵌套循环.我使用预分配,但仍然非常慢.在C中我相信这个函数可以运行至少快10倍-20倍,我认为在CUDA上它实际上可以实时运行.在MATLAB中,4个嵌套循环大约需要20秒.我的堆栈是100个图像,尺寸为640x480x3.

function background = calc_background(stack)

tic;

si = size(stack,1);

sy = size(stack,2);

sx = size(stack,3);

sc = size(stack,4);

background = zeros(sy,sx,sc);

A = zeros(si,1);

for x = 1:sx

for y = 1:sy

for c = 1:sc

for i = 1:si

A(i) = stack(i,y,x,c);

end

background(y,x,c) = median(A);

end

end

end

background = uint8(background);

disp(toc);

end

你能告诉我如何更快地制作这段代码吗?我尝试过以某种方式直接从数组中仅使用索引获取数据,并且它似乎更快.它在3秒内与20秒完成,因此只需编写一个较小的函数就可以达到7倍的性能差异.

function background = calc_background2(stack)

tic;

% bad code, confusing

% background = uint8(squeeze(median(stack(:, 1:size(stack,2), 1:size(stack,3), 1:3 ))));

% good code (credits: Laurent)

background=uint8((squeeze(median(stack,1)));

disp(toc);

end

所以现在我不明白MATLAB是否可以这么快,那么为什么嵌套循环版本如此之慢?我没有进行任何动态调整大小,MATLAB必须在内部运行相同的4个嵌套循环.

为什么会这样?

有没有办法让嵌套循环快速运行,就像在C中自然发生一样?

或者我是否应该习惯于用这种疯狂的单行语句编程MATLAB来获得最佳性能?

更新

谢谢你所有的好答案,现在我了解了很多.我的原始代码堆栈(:,1:大小(堆栈,2),1:大小(堆栈,3),1:3))没有任何意义,它与堆栈完全相同,我只是幸运使用中位数的默认选项,将第一维用于其工作范围.

我想最好问一下如何在另一个问题上写一个有效的问题,所以我在这里问:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值