How to apply a function to each column of a 3D array?

3 ビュー (過去 30 日間)
Massimo
Massimo 2018 年 1 月 15 日
コメント済み: Joss Knight 2018 年 2 月 7 日
I have a function that works on a vector (call it "test_f") and gives as output a vector. I want to apply it to each column of a 3D array ( example A= randn(10,10,10)), without using a loop. Is it possible?
  1 件のコメント
Massimo
Massimo 2018 年 1 月 15 日
This is how it works with a for loop. I would like to do it without for loop, in order to implement later in a GPU.
A=randn(10,10,10);
for k=1:10
for l=1:10
B(:,k,l)=test_f(A(:,k,l));
end
end

サインインしてコメントする。

回答 (1 件)

Joss Knight
Joss Knight 2018 年 1 月 18 日
There isn't anything supported for gpuArray that can take any generic user function in this way. If test_f contains operations supported by pagefun then you could break it down into multiple calls to that. Or convert your array to a cell array ( mat2cell(A, 10, ones(10,1), ones(10,1) ) and process it using cellfun.
  4 件のコメント
Massimo
Massimo 2018 年 2 月 1 日
So there is no advantage to implement in this case the vectorization in the GPU for a function that works on vectors. In fact using a for loop the calculation is much faster than using mat2cell in the CPU and faster than using mat2cell in the GPU. As an example:
tic
C=randn(100,100,100);
M_OUT=ones(3,100,100);
for x=1:100
for y=1:100
M_OUT(:,x,y)=test_mat(C(:,x,y));
end
end
toc %Elapsed time is 0.059773 second
and
tic
A=randn(100,100,100);
B= mat2cell(A, 100, ones(100,1), ones(100,1)) ;
C=cellfun(@test_mat,B,'UniformOutput',false);
D=[C{:}];
Z=reshape(D, [3,100,100]);
toc % Elapsed time is 0.321378 seconds.
and
tic
A=randn(100,100,100,'gpuArray');
B= mat2cell(A, 100, ones(100,1), ones(100,1)) ;
C=cellfun(@test_mat,B,'UniformOutput',false);
D=[C{:}];
Z=reshape(D, [3,100,100]);
toc %Elapsed time is 1.884156 seconds.
Joss Knight
Joss Knight 2018 年 2 月 7 日
Your expectations for the capabilities of a GPU are misguided in this case. There's almost nothing a GPU can do on 100 values faster than the CPU. You need to give it more data. One way is to vectorize your code, which means working out how to formulate the equations so that all the data is processed at once. I can't help you do that as long as I've no idea what test_mat is doing.

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeGPU Computing in MATLAB についてさらに検索

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by