Read data with repeat counts

조회 수: 2 (최근 30일)
Geetartha Dutta
Geetartha Dutta 2023년 10월 6일
답변: Voss 2023년 10월 6일
I have a data file containing numbers with repeat counts denoted by asterisk of the following format: 750.013 2*748.943 2*748.221 ... which is equivalent to 750.013 748.943 748.943 748.221 748.221 ... How can I read this data into a vector? That is, how can I take into account the repeat count operator (*) while reading the data?

채택된 답변

Voss
Voss 2023년 10월 6일
str = fileread('file.txt')
str = '750.013 2*748.943 2*748.221'
C = regexp(regexp(str,'\s+','split'),'\*','split');
idx = cellfun(@isscalar,C);
C(idx) = cellfun(@(x)[{'1'} x],C(idx),'UniformOutput',false);
M = str2double(vertcat(C{:}));
V = repelem(M(:,2).',M(:,1))
V = 1×5
750.0130 748.9430 748.9430 748.2210 748.2210

추가 답변 (2개)

Mathieu NOE
Mathieu NOE 2023년 10월 6일
hello
maybe this ?
data_string = "750.013 2*748.943 2*748.221"; % data imported as string array
data_string2 = split(data_string,' ');
%% main loop
store_value = [];
for k = 1:numel(data_string2)
tmp = char(data_string2(k));
ind = strfind(tmp,"*");
if ~isempty(ind) % we have 2*748.943 data (or alike
factor = str2num(tmp(1:ind-1));
value = str2num(tmp(ind+1:end));
value_all = repmat(value,[factor 1]);
store_value = [store_value;value_all];
else % we have a single value
store_value = [store_value;str2num(tmp)];
end
end
store_value
store_value = 5×1
750.0130 748.9430 748.9430 748.2210 748.2210
  댓글 수: 1
Dyuman Joshi
Dyuman Joshi 2023년 10월 6일
@Mathieu NOE, rather than growing the output dynamically, a better approach would be to preallocate according to the size of data_string2, find and store the number before asterisk for each element (if it does not exist, assign 1) and then use repelem on the unique elements.

댓글을 달려면 로그인하십시오.


Les Beckham
Les Beckham 2023년 10월 6일
Here is one approach.
data_strings = ["750.013"; "2*748.943"; "2*748.221"] % sample input data
data_strings = 3×1 string array
"750.013" "2*748.943" "2*748.221"
iData = 1;
for iStr = 1:numel(data_strings)
if contains(data_strings(iStr), "*")
tmp = split(data_strings(iStr), "*");
rpt = str2double(tmp(1));
data(iData:(iData + rpt - 1)) = str2double(tmp(2));
else
rpt = 1;
data(iData) = str2double(data_strings(iStr));
end
iData = iData + rpt;
end
disp(data)
750.0130 748.9430 748.9430 748.2210 748.2210

카테고리

Help CenterFile Exchange에서 Data Import from MATLAB에 대해 자세히 알아보기

태그

Community Treasure Hunt

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

Start Hunting!

Translated by