Как определить, является ли вход соотношением или числом с плавающей запятой в Matlab?

Мне нужно выполнить пакетную обработку текстовых файлов смешанных единиц, то есть целочисленных отношений и чисел с плавающей запятой (которые представляют собой масштабированные логарифмические приближения неизвестных рациональных или иррациональных чисел). Как Matlab может определить, какой вход какой? Будет ли сканирование на наличие '.' или символ '/' лучше всего?

252.63

4/3

757.89

2/1

В этом примере я узнаю, что числа представляют значения в порядке возрастания (но в смешанных единицах, что типично для моей области исследований), и я бы обрабатывал 252,63 и 757,89 иначе, чем 4/3 и 2/1.

Я не нашел в Matlab такой функции, как isa(x, 'rat'), где x — любая из строк в приведенном выше списке, а «крыса» — отношение.


person Todd H    schedule 15.12.2018    source источник
comment
Если ввод является текстом, я бы просто сканировал / в каждой строке.   -  person Luis Mendo    schedule 15.12.2018


Ответы (2)


Matlab может довольно просто искать в строках определенные символы.

slashmask     = str == '/'; % returns false for every character in str that's not a slash, and true for every one that is.
slashdetected = any(slashmask); % returns false if no character is a slash.

если все, что вам нужно сделать, это взять отношение и оценить его, а затем использовать его так же, как и числа с плавающей запятой, вы можете просто использовать функцию «eval» для получения эквивалента числа с плавающей запятой.

person Iain Yeates    schedule 15.12.2018
comment
Гораздо лучше использовать str2double, чем eval. eval опасен, потому что он может запускать произвольный код, замедляет код и считается плохой практикой, поэтому его следует избегать. В остальном хороший ответ! - person Luis Mendo; 15.12.2018

Спасибо за ваши советы. С вашей помощью я остановился на этом (на строку файла данных):

x = fgetl(fileId);
if isnan(str2double(x)) == true
    % Interpret string as ratio number
    x = str2num(x);
    % then convert to musical cents,
    s(i) = log(x) / log(2) * 1200;
else
    % convert string to float, already in cents.
    s(i) = str2double(x);
end
person Todd H    schedule 15.12.2018
comment
Вы должны сохранить str2double(x) в переменной, она оценивается дважды без всякой причины. Как 2_ - person Brice; 17.12.2018
comment
Кроме того, бессмысленно сравнивать a==true с a логическим значением. if isnan(...) такой же и его легче читать (IMO). -- И обратите внимание, что str2num вызывает eval внутри со всеми связанными с этим опасностями. Если есть вероятность того, что злоумышленник изменит входной файл, вам необходимо сначала проверить входные данные (т. е. убедиться, что они содержат только цифры и /, что легко сделать с all(isstrprop(x,'digit')|(x=='/'))). В некоторых ситуациях беспокоиться об этом совершенно бессмысленно, в других — нет. Но знать об этом полезно! - person Cris Luengo; 17.12.2018