我有一个包含数字数据的3D矩阵(8x5x100)。我需要将从3D矩阵中取出的2D矩阵(8x5)传递到另一个函数中并重复此过程100次(3D矩阵的长度)。我的目标是尽可能加快这个过程。对不起,我无法发布我的实际代码。
当前代码:
3dmatrix=ones(8,5,100);
for i=1:100
output(i)=subfunction(3dmatrix(:,:,i));
end
我读到了使用arrayfun,这可能比循环更快。这是正确的实施吗?
3dmatrix=ones(8,5,100);
for i=1:100
output(i)=arrayfun(@(x) subfunction(x),3dmatrix(:,:,i));
end
当我尝试使用这种新方法执行代码时,我一直在我的"子功能"码。在"子功能"中,它使用2D矩阵的大小进行计算。但是,当我使用arrayfun方法时,它继续将大小读取为1x1而不是8x5,导致我的其余代码崩溃,抱怨无法访问向量的某些部分,因为它们由于大小而未计算差异。我是否正确地传递了矩阵?
在速度必不可少的情况下,解决这个问题的正确方法是什么?谢谢!
答案 0 :(得分:0)
您是否看过arrayfun documentation?在使用arrayfun
时,我认为您不需要使用循环。您还考虑过使用parfor
循环吗?您也可以使用它们来加快代码的速度。
3dmatrix=ones(8,5,100);
parfor i=1:100
output(i)=arrayfun(@(x) subfunction(x),3dmatrix(:,:,i));
end
答案 1 :(得分:0)
来自arrayfun
的Matlab docs,它说,
Apply function to each element of array
这就是你的函数接收1x1元素的原因。如果你想以你使用它的方式使用arrayfun,你需要将3d矩阵转换为2d矩阵的单元格数组。
2dmatrix=ones(8,5);
3dmatrix=cell(1,100);
3dmatrix(:)={2dmatrix};
output = arrayfun(@subfunction,3dmatrix);
这比使用for循环更快吗?我不知道。你需要实际检查一下。使用tic
toc
Matlab调用可以轻松完成此操作。最慢的部分是将3d矩阵转换为单元格数组,但这可能会在代码中轻松更改,具体取决于它的结构。