how do I extract subsets from a vector

8 次查看(过去 30 天)
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 个评论
Robert Jones
Robert Jones 2023-1-17
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 2023-1-17
编辑:dpb 2023-1-17
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.

请先登录,再进行评论。

回答(1 个)

dpb
dpb 2023-1-17
编辑:dpb 2023-1-17
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 个评论
dpb
dpb 2023-1-17
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.

请先登录,再进行评论。

标签

产品


版本

R2021b

Community Treasure Hunt

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

Start Hunting!

Translated by