arrayfun 2d矩阵输入

时间:2014-12-05 23:38:20

标签: performance matlab

我有一个包含数字数据的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,导致我的其余代码崩溃,抱怨无法访问向量的某些部分,因为它们由于大小而未计算差异。我是否正确地传递了矩阵?

在速度必不可少的情况下,解决这个问题的正确方法是什么?谢谢!

2 个答案:

答案 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矩阵转换为单元格数组,但这可能会在代码中轻松更改,具体取决于它的结构。