How to apply a function to each column of a 3D array?
Show older comments
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 Comment
Massimo
on 15 Jan 2018
Answers (1)
Joss Knight
on 18 Jan 2018
0 votes
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 Comments
Massimo
on 18 Jan 2018
Joss Knight
on 20 Jan 2018
You wouldn't use pagefun for this, you would use indexing:
D = A(1:3,:,:);
so it's not a very good example. If your function was, say, the vector dot product between the first 5 and second 5 values in each column, you'd do that using basic array arithmetic:
D = sum( A(1:5,:,:) .* A(6:10,:,:) );
Many algorithms can use this approach. pagefun would come in if you wanted to do some matrix arithmetic. Let's imagine you want to use mtimes to compute the outer product between the columns of the array, perhaps to compute the autocorrelation. You'd reshape them appropriately and call pagefun:
A1 = reshape(A, 10, 1, 10, 10);
A2 = reshape(A, 1, 10, 10, 10);
D = pagefun(@mtimes, A1, A2);
Of course, you wouldn't actually use mtimes to do this because automatic scalar expansion does this.
D = A1 .* A2;
If you have a function that is too complicated to be broken down like this. You can try the cellfun approach.
Acell = mat2cell(A, 10, ones(10,1), ones(10,1));
D = reshape( cellfun(@test_f, Acell), [], 10, 10 );
But there is no parallelism here, so the array passed to each function is going to have be large to make it worth using the GPU. Since the above is no different to a loop, you're back where you started.
Massimo
on 1 Feb 2018
Joss Knight
on 7 Feb 2018
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.
Categories
Find more on Matrices and Arrays in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!