how do I extract subsets from a vector

9 vues (au cours des 30 derniers jours)
Robert Jones
Robert Jones le 17 Jan 2023
Modifié(e) : dpb le 17 Jan 2023
Hello,
I have a vector of the size [70397,2]. It has a title of 2 rows and some text 4 rows between the each data set (2x1801 each). This means a total of 39 sets.
I neet to extract the second column set into a matrix of [39,1801] size.
What would be the most efficient way to do it (I have 100 data sets similar to this one to process)
Thank you
  3 commentaires
Robert Jones
Robert Jones le 17 Jan 2023
here are some excerpts from the data file
file starts below. line 3 is an empty line. 1801 is the numberof lines per data set needed to be extracted ==========
# TICRA DATA EXPORT
# 2023-01-17T06:32:48
# Curve: 23.7 GHz → E_lhc → 0.0 deg [Imaginary]
# From : imported_working_1/ff_sphcut_C_feed_sub_main_allpoints_CP.cut
1801
0.00E+00 -6.54E-09
1.00E-01 -2.00E-02
2.00E-01 -7.96E-02
3.00E-01 -1.78E-01
4.00E-01 -3.15E-01
5.00E-01 -4.87E-01
6.00E-01 -6.94E-01
7.00E-01 -9.32E-01
8.00E-01 -1.20E+00
9.00E-01 -1.49E+00
1.00E+00 -1.80E+00
1.10E+00 -2.14E+00
1.20E+00 -2.48E+00
1.30E+00 -2.84E+00
1.40E+00 -3.19E+00
1.50E+00 -3.55E+00
1.60E+00 -3.91E+00
1.70E+00 -4.25E+00
1.80E+00 -4.58E+00
..
...
# Curve: 25.7 GHz → E_lhc → 0.0 deg [Imaginary]
# From : imported_working_1/ff_sphcut_C_feed_sub_main_allpoints_CP.cut
1801
0.00E+00 -6.54E-09
1.00E-01 -2.00E-02
2.00E-01 -7.96E-02
3.00E-01 -1.78E-01
...
...
# Curve: 23.7 GHz → E_lhc → 0.0 deg [Imaginary]
# From : imported_working_1/ff_sphcut_C_feed_sub_main_allpoints_CP.cut
1801
0.00E+00 -6.54E-09
1.00E-01 -2.00E-02
2.00E-01 -7.96E-02
3.00E-01 -1.78E-01
...
...
dpb
dpb le 17 Jan 2023
Modifié(e) : dpb le 17 Jan 2023
Attach the file as a file with the paperclip instead of pasting text...you could excerpt only a few sets, whether there are 2 or 2000 sets won't matter for testing.

Connectez-vous pour commenter.

Réponses (1)

dpb
dpb le 17 Jan 2023
Modifié(e) : dpb le 17 Jan 2023
One way just using the form of the file...
S=readlines('yourfile.txt'); % import as string array
ixFrom=find(startsWith(S,"# From:")); % index to beginning each section
sizeSection=str2double(S(ixFrom(1)+1)); % size of each group -- all must be same per Q? spec
isFrom=ixFrom+2; % adjust start of offset from header, count records
for i=1:numel(isFrom)
i1=isFrom(i); i2=i1+sizeSection-1; % start, stop records each section
tmp=str2double(split(S(i1:i2))); % convert to numeric array
if i==1
A=tmp; % save first set; keep time as well for first set
else
A=[A tmp(:,2)]; % append second column subsequent
end
end
Caution, air code, watch out for mismatched/missing paren's, etc., etc., etc., ...
This will return one extra column over the requested; if you really, really don't want the time(?) data as well at all, then just remove the special case and start off with
A=[];
The above uses dynamic reallocation; for no larger files than these the performance hit won't be bad compared to trying to reallocate. Or, you could use a cell array for the intermediary and then cell2mat
ADDENDUM:
For early releases predating readlines, use
S=string(textread('yourfile.txt','%s','delimiter','\n','whitespace',''));
  4 commentaires
Dyuman Joshi
Dyuman Joshi le 17 Jan 2023
dpb
dpb le 17 Jan 2023
Didn't notice the release, sorry...in that case take an intermediary step first...
S=string(textread('yourfile.txt', '%s', 'delimiter', '\n','whitespace', ''));
The editor will complain that textread is not recommended, use textscan instead, but while textscan is somewhat more powerful, it's more of a pain to use because it doesn't accept a filename; you first have to open a file handle with fopen and then fclose it when done.
The above brings in the file a cellstr() array, then converts that to the string array to be consistent with remaining existent code posted.

Connectez-vous pour commenter.

Produits


Version

R2021b

Community Treasure Hunt

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

Start Hunting!

Translated by