how to vectorize a for loop in cell arrays

1 vue (au cours des 30 derniers jours)
John
John le 25 Mai 2020
Réponse apportée : Arjun le 10 Sep 2024
I have a cell array named tempfinal, which is 14x196, in which each of these entries is a 3x5 table
i have a code that turns this 14x196 cell into a 1x3 cell, in which each of these 3 cells is a 14x196 table that keeps the ith (out of 3) row of the 2nd column.
the code looks like this:
temptemp=cell(1,N);
for T=1:L
for U=1:V
for i=1:N
temptemp{1,i}(T,U)= tempfinalnew{T,U}(i,2);
end
end
end
how can i vectorize this to avoid these 3 for loops? i tried reading the arrayfun documentation but I am not sure how to get started
I would appreciate any help
  2 commentaires
John
John le 26 Mai 2020
part of my confusion comes from the fact that if i were to do this, for example, and get rid of one of the for-loops,
T=1:1:L;
for U=1:V
for i=1:N
temptemp{1,i}(T,U)= tempfinalnew{T,U}(i,2);
end
end
i get an error that says Expected one output from a curly brace or dot indexing expression, but there were 14 results.
Stephen23
Stephen23 le 26 Mai 2020
"part of my confusion comes from the fact that if i were to do this..."
then you are generating a comma-separated list. Read these to know more:

Connectez-vous pour commenter.

Réponses (1)

Arjun
Arjun le 10 Sep 2024
Hi @John,
It seems that you are attempting to extract data from a cell array and transfer it to another cell array, aiming to minimize the use of for loops as much as possible.
This can be done using “arrayfun” function in MATLAB, which you also mentioned in your question. We can use the “arrayfun” function in MATLAB to apply a function to each element of an array without explicitly writing a loop. It also helps in simplifying and improving the readability of the code.
You can use the “arrayfun” and supply it with an anonymous function which will take two inputs(t,u) and for each combination of these two inputs it will access the ith row and 2nd column of the table stored in tempfinal(t,u) which is the original array. We also use an additional property “UniformOutput” and make it “false” so that we get a cell array as output.
Here is how we can use it in the code:
% Parameters
L = 14; % Number of rows in tempfinal
V = 196; % Number of columns in tempfinal
N = 3; % Number of rows in each table within tempfinal
% Generate sample data for tempfinal
tempfinal = cell(L, V);
% Populate tempfinal with 3x5 tables
for t = 1:L
for u = 1:V
% Create a 3x5 table with random data
data = array2table(rand(3, 5), 'VariableNames', {'Var1', 'Var2', 'Var3', 'Var4', 'Var5'});
tempfinal{t, u} = data;
end
end
% Initialize the output cell array
temptemp = cell(1, N);
% Use arrayfun to extract the ith row of the 2nd column from each table
% Main Code starts from here, till here only sample data generation was
% being done
for i = 1:N
temptemp{i} = arrayfun(@(t, u) tempfinal{t, u}{i, 2}, ...
repmat((1:L)', 1, V), ...
repmat(1:V, L, 1), ...
'UniformOutput', false);
% Convert the cell array to a matrix
temptemp{i} = cell2mat(temptemp{i});
end
% Display the result
disp('Extracted Data:');
for i = 1:N
fprintf('Data for row %d of the 2nd column:\n', i);
disp(temptemp{i});
end
The result of running a code will be “temptemp” which is a 1x3 cell array where each cell contains a 14x196 table.
Kindly refer to documentation of “arrayfun” to understand more about it.
I hope it will help!

Catégories

En savoir plus sur Matrices and Arrays dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by