How to apply arrayfun on a 3D matrix?
6 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Mark Golberg
el 25 de Jul. de 2017
Comentada: Mark Golberg
el 1 de Ag. de 2017
Hello,
I have the following matrix:
size(A) = [64 64 1000];
I'd like to apply the following function on each frame, along the 3rd dimension.
lasca_func = @(x)(mean2(x)/std2(x));
How can I do this via arrayfun, and not through for-loop?
Thanks in advance!
1 comentario
Adam
el 25 de Jul. de 2017
I don't think arrayfun can be used for that - it takes the array values in turn as linear indices so the structure of the array is not preserved and the function will be applied per element for the whole 64*64*1000.
Respuesta aceptada
Stephen23
el 25 de Jul. de 2017
Editada: Stephen23
el 25 de Jul. de 2017
"How can I do this via arrayfun, and not through for-loop?"
You can't, because arrayfun operates on each element of an array. You cannot tell it to operate along specific dimensions of an array. An alternative would be to split the array into a cell array and then call cellfun, but this would be slower than using a preallocated loop.
Unless you have a gpuArray the simplest solution is to use mean and std, and specify the dimension:
>> A = rand(64,64,1000);
>> Z = mean(A,3)./std(A,0,3);
>> size(Z)
ans =
64 64
2 comentarios
Adam
el 25 de Jul. de 2017
Editada: Adam
el 25 de Jul. de 2017
As I understood the question the result should be a 1x1000 result though with the mean/std calculation over each 64*64 matrix.
I was thinking something similar to this, but while it works for mean you can't do this for standard deviation as it doesn't give correct results:
mean( mean( a, 1 ), 2 ) ./ std( std( a, [], 1 ), [], 2 )
Más respuestas (0)
Ver también
Categorías
Más información sobre Resizing and Reshaping Matrices en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!