索引编制后,MATLAB不需要从double转换为int32

时间:2018-10-29 12:53:18

标签: matlab types int double

我有这段代码可以从文本文件,四列-字符串,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功能中的“真实”数据?

2 个答案:

答案 0 :(得分:2)

doubleint数据转换为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类型。