Find maximum value in a column of each cell in a large set of cell array?

4 views (last 30 days)
I have a large cell array (e.g., 35598x1 cell). Each cell consists of mxn double (e.g., 26x5 double). I would like to find maximum value in nth column of each cell (let's say 5th column). How do I do that? Is it possible to do without using a loop as it is taking so much of time. Any help will be highly appriciated. Thank you.
  3 Comments
Dyuman Joshi
Dyuman Joshi on 8 Mar 2023
Loops if used properly can be very efficient.
What have you tried? Show us your code and attach the data using the paperclip button.
Raju Kumar
Raju Kumar on 8 Mar 2023
@Dyuman Joshi @Fangjun Jiang Thanks for your reply. I have attached the file. Here is what I am trying
for i=1:size(alpha200plus) % File name is alpha200plus when Data.mat is read
AlphaToT(i,:) = max(alpha200plus{i,1}(:,5))
end
I actually access each cell and its data one by one, and then find a maximum. This takes so long to process 35598x1 cell (Please note, here the file size has been reduced to meet MATLAB upload size)
I also tried cellfun as,
cellfun(@max, alpha200plus, 'UniformOutput', false)
but this also gives a cell consiting a vector that has a maximum of existing variables inside.
Thanks.
Raju

Sign in to comment.

Accepted Answer

Fangjun Jiang
Fangjun Jiang on 8 Mar 2023
c={rand(10),rand(11),rand(12)};
N=5;
cellfun(@(M) max(M(:,N)),c)
ans = 1×3
0.9427 0.9110 0.9603

More Answers (1)

Dyuman Joshi
Dyuman Joshi on 8 Mar 2023
Edited: Dyuman Joshi on 8 Mar 2023
Preallocate data accordingly for outputs of big size -
load Data.mat
f1 = @() loopprealloc(alpha200plus);
f2 = @() simpleloop(alpha200plus);
f3 = @() funcell(alpha200plus);
%checking if outputs are equal or not
isequal(f1(),f2(),f3())
ans = logical
1
fprintf('time taken by loop with preallocation = %f secs', timeit(f1))
time taken by loop with preallocation = 0.018185 secs
fprintf('time taken by loop WITHOUT preallocation = %f secs', timeit(f2))
time taken by loop WITHOUT preallocation = 0.020928 secs
fprintf('time taken by cellfun = %f secs', timeit(f3))
time taken by cellfun = 0.036368 secs
function y = loopprealloc(x)
%Preallocation
y=zeros(size(x));
for k=1:size(x,1)
y(k,1) = max(x{k,1}(:,5));
end
end
function y = simpleloop(x)
for k=1:size(x,1)
y(k,1) = max(x{k,1}(:,5));
end
end
function y = funcell(x)
y = cellfun(@(in) max(in(:,5)), x);
end

Categories

Find more on Shifting and Sorting Matrices 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!