Multiple loops to build structure?
2 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
I have k=6 matrices of sound data that I am trying to loop thru to create structures for plotting.
Each matrix has 9 channels: X1-X3, Y1-Y3, Z1-Z3. Each channel has 5 columns of data. The first column is time, and the next 4 columns are sound data: a hi and lo set of + and –data.
I want to create 6 structures that contain data from the 6 groups with some manual inputs for naming.
The structures need to have a group, name, hi or lo, positive or negative, and then the data that gets read in from columns.
Can someone show me a faster and easier way of doing what I’m doing this? Especially because it is so repetitive. Below is my futile approach to setting this up with an example of how I plan to plot it.
%group matrix = k=1
g(1).x1.group = 'Group 1:';
g(1).x1.name = 'North';
g(1).x1.ch1.name.pos = 'Channel Hi';
g(1).x1.ch1.name.neg = 'Channel Lo';
g(1).x1.ch1.pos = [group(1)(:,1),group(1)(:,2)];
g(1).x1.ch1.neg = [group(1)(:,1),group(1)(:,3)];
g(1).x1.ch2.name.pos = 'Channel Hi';
g(1).x1.ch2.name.neg = 'Channel Lo';
g(1).x1.ch2.pos = [group(1)(:,1),group(1)(:,4)];
g(1).x1.ch2.neg = [group(1)(:,1),group(1)(:,5)];
%
%Group 2 X data
g(1).x2.group = 'Group 1:';
g(1).x2.name = 'East';
g(1).x2.ch1.name.pos = 'Channel Hi';
g(1).x2.ch1.name.neg = 'Channel Lo';
g(1).x2.ch1.pos = [group(1)(:,1),group(1)(:,6)];
g(1).x2.ch1.neg = [group(1)(:,1),group(1)(:,7)];
g(1).x2.ch2.name.pos = 'Channel Hi';
g(1).x2.ch2.name.neg = 'Channel Lo';
g(1).x2.ch2.pos = [group(1)(:,1),group(1)(:,8)];
g(1).x2.ch2.neg = [group(1)(:,1),group(1)(:,9)];
%Group 3 X data
g(1).x3.group = 'Group 1:';
g(1).x3.name = 'West';
g(1).x3.ch1.name.pos = 'Channel Hi';
g(1).x3.ch1.name.neg = 'Channel Lo';
g(1).x3.ch1.pos = [group(1)(:,1),group(1)(:,10)];
g(1).x3.ch1.neg = [group(1)(:,1),group(1)(:,11)];
g(1).x3.ch2.name.pos = 'Channel Hi';
g(1).x3.ch2.name.neg = 'Channel Lo';
g(1).x3.ch2.pos = [group(1)(:,1),group(1)(:,12)];
g(1).x3.ch2.neg = [group(1)(:,1),group(1)(:,13)];
%group 2
g(2).x1.group = 'Group 2:';
g(2).x1.name = 'North';
g(2).x1.ch1.name.pos = 'Channel Hi';
g(2).x1.ch1.name.neg = 'Channel Lo';
g(21).x1.ch1.pos = [group(2)(:,1),group(2)(:,2)];
.
.
.
%and so on, and so on
figure()
for k = 1:4
legStr = sprintf( '%s', g(k).x1.ch1.name.pos);
loglog(g(k).x1.ch1.pos(:,1), g(k).x1.ch1.pos(:,2), 'k-', 'Displayname', legStr); hold on; grid minor;
legStr = sprintf( '%s', g(k).x1.ch2.name.neg);
loglog(g(k).x1.ch2.neg(:,1), g(k).x2.ch2.neg(:,2), 'r-', 'Displayname', legStr);
end
2 commentaires
VBBV
le 19 Fév 2024
Modifié(e) : VBBV
le 19 Fév 2024
May be you can extend the code which you plotted at the end by using additional for loop as shown below
for k = 1:6 % for groups
for J = 1:3 % for channels
g(k).x(J).group = 'Group 1:';
g(k).x(J).ch1.name.pos = 'Channel Hi'
g(k).x(J).ch1.name.neg = 'Channel Lo';
g(k).x(J).name = 'North';
end
end
Stephen23
le 19 Fév 2024
"Can someone show me a faster and easier way of doing what I’m doing this? Especially because it is so repetitive."
Use indexing.
Avoid putting meta-data (e.g. pseudo-indices) into the fieldnames (or names of variables).
Computers are really only very good at repeating very simple tasks in loops. So when you sit and copy-and-paste lots of lines of code like that you are just doing the computer's job for it. Much better: use indexing, let the computer do the looping.
Réponse acceptée
Sulaymon Eshkabilov
le 19 Fév 2024
It can be done somewhat what like this one:
GN = {'Group 1:'; 'Group 2:'; 'Group 3:'};
NA = {'North'; 'East'; 'West'];
for ii = 1:3
g(ii).x1.group = GN{ii};
g(ii).x2.group = GN{ii};
g(ii).x3.group = GN{ii};
g(ii).x1.name = NA{ii};
g(ii).x2.name = NA{ii};
g(ii).x3.name = NA{ii};
...
end
0 commentaires
Plus de réponses (0)
Voir également
Catégories
En savoir plus sur Loops and Conditional Statements 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!