Dealing with Data Structures

1 visualizzazione (ultimi 30 giorni)
Abdulrrahman AlGadi
Abdulrrahman AlGadi il 14 Set 2021
Commentato: Stephen23 il 15 Set 2021
Hello all!
I am importing data from a .TDMS file and converting into CSV format. So, after converting it I get the data as struct type.
My issue is that I want to assign different arrays in the struct to different variables and would like to use for loop to it for code simplicity.
For examle:
Data is the struct variable.
Assigning variables code:
impact_data0 = Data.Configuration0_Impact00.cDAQ1Mod1_ai0.data'; ---> 1
accel_data0(:,1) = Data.Configuration0_Impact00.cDAQ1Mod1_ai1.data'; --->2
accel_data0(:,2) = Data.Configuration0_Impact00.cDAQ1Mod1_ai2.data'; ---> 3
accel_data0(:,3) = Data.Configuration0_Impact00.cDAQ1Mod1_ai3.data'; ---> 4
impact_data1 = Data.Configuration0_Impact01.cDAQ1Mod1_ai0.data';
accel_data1(:,1) = Data.Configuration0_Impact01.cDAQ1Mod1_ai1.data';
accel_data1(:,2) = Data.Configuration0_Impact01.cDAQ1Mod1_ai2.data';
accel_data1(:,3) = Data.Configuration0_Impact01.cDAQ1Mod1_ai3.data';
What I would like to do is to repeat the same first four lines and change the impact number only [in bold]
Thanks !
  1 Commento
Stephen23
Stephen23 il 15 Set 2021
"My issue is that I want to assign different arrays in the struct to different variables and would like to use for loop to it for code simplicity."
Simple and efficient code would not change the variable name, it would just use indexing.

Accedi per commentare.

Risposte (2)

Dave B
Dave B il 14 Set 2021
Modificato: Dave B il 14 Set 2021
I think in general it's better if your struct is an array rather than using names of fields in the struct as an array, but if you're stuck with this from the import, it's actually not too difficult to dynamically specify a field name, you just need to put it in parentheses:
s = struct('Var01',pi,'Var02',2*pi,'Var03',3*pi);
vals = nan(1,3);
for i = 1:3
varname = sprintf('Var%02d',i);
vals(i) = s.(varname);
end
disp(vals)
3.1416 6.2832 9.4248
  1 Commento
Dave B
Dave B il 14 Set 2021
after seeing @Steven Lord's post I realized that you were also trying to name your outputs, I'd avoid this (as Steven explains). If differences in sizes make it difficult to use his method, use a cell array:
s = struct('Var01', sin(linspace(0,2*pi,50)), 'Var02', cos(linspace(0,2*pi,100)));
vals = cell(1,2);
for i = 1:2
varname = sprintf('Var%02d',i);
vals{i} = s.(varname);
end
disp(vals)
{1×50 double} {1×100 double}

Accedi per commentare.


Steven Lord
Steven Lord il 14 Set 2021
Can you create variables named impact_data0, impact_data1, impact_data2, etc.? Yes.
Should you do this? The general consensus is no.
If you wanted to access the data from each struct array in turn and operate on it (like in a for loop) I'd use a temporary variable (with a fixed name) to store the data to be processed. You can use the technique Dave B posted to get the data into that temporary variable. Once you've completed processing then store the finished results in a section of a (fixed named) variable.
Note that the code below has no temp1, temp2, temp3, etc. variables. I'm using randi rather than indexing into a struct array because it's quicker to write as an example, but the general technique will still work with struct data.
finalResults = zeros(3, 5);
for k = 1:5
temp = randi(10, 3, 3)
s = sum(temp, 2)
finalResults(:, k) = s;
end
temp = 3×3
4 5 4 4 6 6 6 4 10
s = 3×1
13 16 20
temp = 3×3
5 2 7 8 9 2 8 3 6
s = 3×1
14 19 17
temp = 3×3
6 5 2 10 7 9 10 3 10
s = 3×1
13 26 23
temp = 3×3
4 10 7 7 4 8 2 9 6
s = 3×1
21 19 17
temp = 3×3
1 6 6 9 8 7 10 3 2
s = 3×1
13 24 15
finalResults
finalResults = 3×5
13 14 13 21 13 16 19 26 19 24 20 17 23 17 15

Categorie

Scopri di più su Data Type Conversion in Help Center e File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by