Filter löschen
Filter löschen

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

5 Ansichten (letzte 30 Tage)
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 Kommentare
Dyuman Joshi
Dyuman Joshi am 8 Mär. 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 am 8 Mär. 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

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Fangjun Jiang
Fangjun Jiang am 8 Mär. 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

Weitere Antworten (1)

Dyuman Joshi
Dyuman Joshi am 8 Mär. 2023
Bearbeitet: Dyuman Joshi am 8 Mär. 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

Community Treasure Hunt

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

Start Hunting!

Translated by