從cell轉(zhuǎn)化到double
經(jīng)常困惑于在讀入文件中既有字符串效诅,又包含數(shù)字情況下而不能用‘%f’格式。于是乎楣黍,調(diào)用‘%s’格式的結(jié)果是讀入的dataArray為字符串cell。此時(shí)如果需要轉(zhuǎn)化dataArray中的數(shù)字字符串為double類型,通彻煜悖可以有以下幾種方法:
1. for循環(huán)
2. cellfun(@(x), str2num(dataArray))
3. str2num(char(dataArray))
接下來分別以上述三種方法為例進(jìn)行對(duì)比。在此先給出結(jié)論幼东,目前來說第3種方法str2num(char(dataArrary))最有效臂容。
下邊是一個(gè)簡(jiǎn)單的matlab程序,分別記錄三種方法的CPU時(shí)間筋粗。在讀入dataArray為500*4的情況下策橘,耗時(shí)分別為
進(jìn)一步, 增加讀入數(shù)據(jù)量娜亿,提升dataArray至5000*4和50000*4的情況下丽已,耗時(shí)時(shí)間如下
可見,在數(shù)據(jù)量較小的情況下买决,第3種方法最有效沛婴,可是當(dāng)數(shù)據(jù)量比較大的時(shí)候吼畏,三種方法相當(dāng),而且猜測(cè)第1,3種方法同理嘁灯。
附:源程序
clear all,clc
%% creat a data file
data_creat = log(rand(500,4)*100);
fileID = fopen('data_creat.txt','w');
fprintf(fileID,'%6s %6s %6s %6s\n','data1','data1','data1','data1');
fprintf(fileID,'%.6f %.6f %.6f %.6f \n',data_creat);
fclose(fileID);
%% read the data from the ceated file into a cell
fileID = fopen('data_creat.txt');
formatSpec = '%s %s %s %s \n';
dataArray = textscan(fileID, formatSpec, 'HeaderLines',1);
fclose(fileID);
% first method: for loop
tic
dataCol = [dataArray{:,1}, dataArray{:,2}, dataArray{:,3}, dataArray{:,4}];
for i = 1:size(dataCol,1)
data(i,1) = str2num(dataCol{i,1});
data(i,2) = str2num(dataCol{i,2});
data(i,3) = str2num(dataCol{i,3});
data(i,4) = str2num(dataCol{i,4});
end
toc
% second method: cellfun
clearvars data
tic
data(:,1) = cellfun(@(x) str2num(x), dataArray{1,1});
data(:,2) = cellfun(@(x) str2num(x), dataArray{1,2});
data(:,3) = cellfun(@(x) str2num(x), dataArray{1,3});
data(:,4) = cellfun(@(x) str2num(x), dataArray{1,4});
toc
% third method: str2num(char)
clearvars data
tic
data(:,1) = str2num(char(dataArray{:,1}));
data(:,2) = str2num(char(dataArray{:,2}));
data(:,3) = str2num(char(dataArray{:,3}));
data(:,4) = str2num(char(dataArray{:,4}));
toc