robinj
robinj

Reputation: 147

MATLAB Unwanted conversion from double to int32 after indexing

I have this code to load data from text file, four columns - string, 3 integer columns and decimal number.

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);

In a temp variable, the last column is saved as decimal number, however, the command data = [data; [ temp{:} ] ]

has as consequence its rounding and I get 0 or 1 in last column.

I am asking why is that?

temp looks like (1x4 cell):

[5248000;5248100;....]  [5248100;5248200;....]
[111;95;....]   [0,600000000000000;0,570000000000000;....]

data then looks like (1x4 matrix):

5248000 5248100 111 1
5248100 5248200 95  1

EDIT: Retesting (recreation of the same variable, just copied numbers from variable editor)

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{:}]

This makes it correctly! The last columnd is decimal.

But why it doesn't work on "real" data from textscan function?

Upvotes: 1

Views: 59

Answers (2)

Luis Mendo
Luis Mendo

Reputation: 112689

Concatenating double and int data casts to the int type. For example:

>> [pi; int16(5)]
ans =
  2×1 int16 column vector
   3
   5

To avoid that, you can cast to double before concatenating. So in your case use something like the following to convert each cell's content to double(thanks to @CrisLuengo for a correction):

[ data; cellfun(@double, temp, 'uniformoutput', true) ]

Upvotes: 2

user7431005
user7431005

Reputation: 4539

Consider reading everything as floating point values:

change

formatSpec = '%*s %d %d %d %f';    

to

formatSpec = '%*s %f %f %f %f';    

If works in your EDIT because your variables are already of type double.

Upvotes: 2

Related Questions