使用pagefun - MATLAB计算3D数组的范数

时间:2014-04-13 22:25:05

标签: matlab parallel-processing gpu

是否可以使用pagefun同时在多个页面上计算规范(并执行其他内置GPU函数 - http://www.mathworks.co.uk/help/distcomp/run-built-in-functions-on-a-gpu.html)?

例如,我需要计算3D数组的规范。

N = 10000
Sig = gpuArray(2,2000,N) % This is just to get an idea of the dimensions. Its populated elsewhere

% This is what I am currently doing.
for k = 1:N
    TNorm(k,:) = [norm(Sig(1,:,k),2) norm(Sig(2,:,k),2)];
end

有没有办法一次性执行它而不是遍历第三维来每次计算规范?可以这样做吗?

pagefun(norm(Sig,2)) % This gives the error: Input data must be a double or single vector or 2D matrix.

提前致谢! :)

1 个答案:

答案 0 :(得分:0)

假设你有一个3D数组,在你的情况下我们称之为E:

E = rand(3,3,4)%这是一个尺寸为3x3x4

的3D数组

如果你想在这种情况下从1到4计算页面的范数,你可以使用:

norm_E = arrayfun(@(idx) norm(E(:,:,idx)), 1:size(E,3))

输出将是:

norm_E = [(norm array 1),(norm array 2),(norm array 3),(norm array 4)]

你也不仅限于2-norm,你可以使用任何你喜欢的规范,例如,如果你想使用你可以使用的无穷大规范:

norm_E = arrayfun(@(idx) norm(E(:,:,idx),inf), 1:size(E,3))

使用arrayfun比for循环更快。如果你被限制使用pagefun,我很抱歉我的matlab版本没有这个功能。