我有这段代码可以从文本文件,四列-字符串,3个整数列和十进制数加载数据。
fileID = fopen(Files(j,1).name);
formatSpec = '%*s %d %d %d %f';
data = zeros(0, 4, 'double');
k = 0;
while ~feof(fileID)
k = k+1;
temp = textscan(fileID,formatSpec,10,'HeaderLines',1);
data = [data; [ temp{:} ] ] ;
end
fclose(fileID);
在temp变量中,最后一列保存为十进制数,但是,该命令 数据= [数据; [temp {:}]]
因此将其舍入,最后一列为0或1。
我在问为什么?
温度看起来像(1x4格):
[5248000;5248100;....] [5248100;5248200;....]
[111;95;....] [0,600000000000000;0,570000000000000;....]
数据看起来像(1x4矩阵):
5248000 5248100 111 1
5248100 5248200 95 1
编辑: 重新测试(创建相同变量,只是从变量编辑器复制数字)
temp=cell(1,4);
temp{1}=[0;100;200;300;400;500;600;700;800;900];
temp{2}=[100;200;300;400;500;600;700;800;900;1000];
temp{3}=[143;155;150;128;121;122;137;145;145;126];
temp{4}=[0.340000000000000;0.450000000000000;0.370000000000000;...
0.570000000000000;0.570000000000000;0.580000000000000;...
0.590000000000000;0.500000000000000;0.460000000000000;0.480000000000000];
tempx=[temp{:}]
这使它正确!最后一列是十进制。
但是为什么它不适用于textscan功能中的“真实”数据?
答案 0 :(得分:2)
将double
和int
数据转换为int
类型。例如:
>> [pi; int16(5)]
ans =
2×1 int16 column vector
3
5
为避免这种情况,可以在连接前强制转换为double
。因此,在您的情况下,请使用以下类似内容将每个单元格的内容转换为double
(感谢@CrisLuengo进行更正):
[ data; cellfun(@double, temp, 'uniformoutput', true) ]
答案 1 :(得分:2)
考虑将所有内容都读取为浮点值:
更改
formatSpec = '%*s %d %d %d %f';
到
formatSpec = '%*s %f %f %f %f';
如果在您的EDIT中有效,因为您的变量已经是double
类型。