MATLAB Нежелательное преобразование из двойного в int32 после индексации - PullRequest
0 голосов
/ 29 октября 2018

У меня есть этот код для загрузки данных из текстового файла, четыре столбца - строка, 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 {:}]]

имеет, как следствие, округление, и я получаю 0 или 1 в последнем столбце.

Я спрашиваю, почему это так?

temp выглядит как (1x4 ячейка):

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

данные тогда выглядят как (матрица 1x4):

5248000 5248100 111 1
5248100 5248200 95  1

EDIT: Повторное тестирование (воссоздание одной и той же переменной, только что скопированные числа из редактора переменных)

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

Это делает это правильно! Последний столбец десятичный.

Но почему он не работает с "реальными" данными из функции textcan?

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Рассмотрим все как значения с плавающей запятой:

изменить

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

до

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

Если работает в EDIT, потому что ваши переменные уже имеют тип double.

0 голосов
/ 29 октября 2018

Конкатенация данных double и int приводится к типу int. Например:

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

Чтобы избежать этого, вы можете привести к double перед конкатенацией. Поэтому в вашем случае используйте что-то вроде следующего, чтобы преобразовать содержимое каждой ячейки в double (спасибо @ CrisLuengo за исправление):

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