Convert 1x1 cell array to double
5 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Hi all,
I am trying to extract some data for plotting from a .csv file (find attached obtained from a simulation program. The problem is, when I import the data as a table, then the values I want to extract have the following form:
1x1 cell array : {'0.000202796 0.000207569 0.000211678 0.001893233 0.001898714 0.001899608 0.008668105 ... '}
I manage to extract the data succesfully (rttTime double vector) , but I am not sure if there is a more efficient way of doing it:
It would be great to have suggestions, how to improve it, also I am open for suggestions concerning the import of data from the .csv file.
Kind regards,
Pablo
% read data with all stats vector
statsTable = readtable("stats_1-trace_vector_example.csv", 'PreserveVariableNames', true);
% Extract index of row containing RTT
rttIdx = statsTable.name == "rtt:vector" & statsTable.attrname == "";
rttTable = statsTable(rttIdx,:);
rttTime = str2double(strsplit(cell2mat(rttTable.vectime)));
rttValues = str2double(strsplit(cell2mat(rttTable.vecvalue)));
plot(rttTime,rttValues);
2 comentarios
Stephen23
el 2 de Ag. de 2023
Editada: Stephen23
el 2 de Ag. de 2023
Given that rather unfortunate file format (storing vectors of numeric data in quoted strings), your approach seems reasonable and understandable. Of course if efficiency is really the goal then you should replace CELL2MAT with some basic indexing into that cell array. SSCANF might be the fastest approach.
Respuestas (2)
Stephen23
el 2 de Ag. de 2023
Editada: Stephen23
el 2 de Ag. de 2023
Here with no intermediate table:
statsTable = readtable("stats_1-trace_vector_example.csv", 'PreserveVariableNames', true);
rttIdx = statsTable.name == "rtt:vector" & statsTable.attrname == "";
rttTime = sscanf(statsTable{rttIdx,'vectime'}{1},'%f',[1,Inf]);
rttValues = sscanf(statsTable{rttIdx,'vecvalue'}{1},'%f',[1,Inf]);
plot(rttTime,rttValues);
rttTable = statsTable(rttIdx,:);
timeit(@() str2double(strsplit(cell2mat(rttTable.vectime))))
timeit(@() str2double(strsplit(rttTable.vectime{1})))
timeit(@() str2num(rttTable.vectime{1}))
timeit(@() sscanf(rttTable.vectime{1},'%f',[1,Inf]))
0 comentarios
Bruno Luong
el 2 de Ag. de 2023
Not sure if it's more efficient but it's shorter
rttTime = str2num(rttTable.vectime{1})
2 comentarios
Bruno Luong
el 2 de Ag. de 2023
Yes it's more efficient as well
statsTable = webread('https://www.mathworks.com/matlabcentral/answers/uploaded_files/1448087/stats_1-trace_vector_example.csv');
rttIdx = statsTable.name == "rtt:vector" & statsTable.attrname == "";
rttTable = statsTable(rttIdx,:);
rttTime = str2double(strsplit(cell2mat(rttTable.vectime)));
timeit(@() str2double(strsplit(cell2mat(rttTable.vectime))))
timeit(@() str2num(rttTable.vectime{1}))
Ver también
Categorías
Más información sobre Matrix Indexing en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!
