How to extract sub-matrices from a big matrix?

12 vues (au cours des 30 derniers jours)
Mohamed Nedal
Mohamed Nedal le 21 Déc 2019
Modifié(e) : Stephen23 le 23 Déc 2019
Hello everyone,
I have two matrices, kindly find the attached file
soho ---> size = 23×12 , each row represents an event.
omni ---> size = 8760 × 17 , each row represent an hour (timeseries data).
The first three columns are, in order, "year", "month", "day".
I need to do the following operation:
if soho_day = omni_day
take that omni_day and the following 120 rows (hours) and put them as a separate matrix with a prefix (i.e., omniSUB_1).
and so on
I have these code blocks
% to find the matched date and store the that day along with the following 5 days (120 hours) in another matrix.
for n = 1:length(soho)
for m = 1:length(omni)
if datetime(soho(n,1),soho(n,2),soho(n,3),...
'Format','dd/MM/yyyy') == ...
datetime(omni(m,1),omni(m,2),omni(m,3),...
Format','dd/MM/yyyy')
for k = m:120
omniSUB{n,:} = omni(k,:);
end
end
end
end
and
% to create sub-matrices.
Prefix = 'omniSUB_';
for i = 1:Month_length
var_name = strcat(Prefix, num2str(i));
data_child = genvarname(var_name);
eval([data_child ' = omniSUB{i}']);
end
but I don't know how to put them together to do that operation. Please correct me.
I appreciate your help.
Thanks in advance
  4 commentaires
Stephen23
Stephen23 le 22 Déc 2019
Modifié(e) : Stephen23 le 22 Déc 2019
"That's why I need to separate each 5-day period in a separate matrix because I have another function that will loop over these matrices and do further analysis for each one."
Exactly as I wrote in my earlier comment, you just need to use indexing.
You can easily store the separated data in one array (e.g. a cell array) using basic MATLAB indexing, which will be much simpler and more efficient than what you are doing now, and then it is trivial to "loop over these matrices and do further analysis for each one" as you wrote. So far nothing you have shown or described requires your complex and inefficeint approach of accessing variable names dynamically.
Mohamed Nedal
Mohamed Nedal le 22 Déc 2019
I'll try the indexing approach. Thanks!

Connectez-vous pour commenter.

Réponse acceptée

Ridwan Alam
Ridwan Alam le 21 Déc 2019
Modifié(e) : Ridwan Alam le 21 Déc 2019
% to find the matched date and store the that day along with the following 5 days (120 hours) in another matrix.
for n = 1:size(soho,1)
omniRowInd = find(omni(:,1)==soho(n,1) & omni(:,2)==soho(n,2) & omni(:,3)==soho(n,3),1,'first');
if ~isempty(omniRowInd)
tempTable = omni(omniRowInd:min(omniRowInd+119,size(omni,1)),:);
eval(['omniSUB_' num2str(n) '=' 'tempTable;']);
end
end
Hope this helps!
  10 commentaires
Stephen23
Stephen23 le 23 Déc 2019
Modifié(e) : Stephen23 le 23 Déc 2019
"Could you determine the problem here plz? "
Are you checking all of the cells of the cell array, not just the last one?:
find(~cellfun(@isempty,C))
It is quite possible that the if condition is never true. You can check this by printing it in the loop, or collect it into a vector and checking it after the loop:
N = size(soho,1);
C = cell(1,N);
L = false(1,N); % logical vector
for k = 1:N
omniRowInd = find(omni(:,1)==soho(k,1) & omni(:,2)==soho(k,2) & omni(:,3)==soho(k,3),1,'first');
if ~isempty(omniRowInd)
L(k) = true; % if the condition is true
C{k} = omni(omniRowInd:min(omniRowInd+119,end),:);
end
end
% Check on which iteration/s the conditions was true:
any(L)
find(L)
Note how easy it is using indexing to access the new variable L. Trying to use eval to do something similar with lots of numbered variables would be much more complex.
Mohamed Nedal
Mohamed Nedal le 23 Déc 2019
Modifié(e) : Mohamed Nedal le 23 Déc 2019
Yes, you're right.
I found where's the error, it was a glitch in defining the date-time pairs and I corrected it.
Thank you!

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Logical dans Help Center et File Exchange

Produits


Version

R2017b

Community Treasure Hunt

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

Start Hunting!

Translated by