matlab“arrayfun”函数

时间:2011-03-18 09:02:15

标签: matlab

考虑以下函数,它将灰度图像(2D矩阵)作为输入:

function r = fun1(img)
r = sum(sum(img));

我正在考虑使用arrayfun来处理一系列图像(3d矩阵),从而无需使用for循环:

arrayfun(@fun1, imgStack);

但是arrayfun尝试将imgStack的每个元素视为fun1的输入,之前操作的结果也是3D矩阵。如何让arrayfun知道我只想在fun1的第三维上重复imgStack

另一个问题是arrayfun并行调用fun1吗?

2 个答案:

答案 0 :(得分:5)

在这种情况下,您不需要arrayfun来执行计算,您只需执行此操作:

imgStack = rand( 10, 10, 4 ); % 4 10x10 images
r = sum( sum( imgStack, 1 ), 2 ); % sum along both dimensions 1 and 2

一般来说,许多MATLAB操作会同时对整个数组进行操作,这是避免循环的常用方法。

MATLAB的正常“arrayfun”不是平行的。但是,对于GPUArrays(使用Parallel Computing Toolbox),存在arrayfun的并行版本。

答案 1 :(得分:0)

关于你的第一个问题: 你可能会尝试accumarray。一个建议

function ds = applyfun_onfirstdim(arr, h_fun)

dimvec = size(arr);
indexarr = repmat( (1:dimvec(1))', [1, dimvec(2:end)] );

ds = accumarray(indexarr(:), arr(:), [], h_fun);

这将创建一个与输入" arr"相同尺寸的辅助索引数组。要应用h_fun的每个切片都获得相同的索引号。在这个例子中,它是第一个。