MATLAB в C ++: csvread () не поддерживается MATLAB Coder - PullRequest
1 голос
/ 21 января 2020

Мне нужно перенести скрипт MATLAB, который использует .csv s для чтения и записи конфигов и данных с csvread(), на C ++.

Очевидным выбором было использование приложения Coder в MATLAB, но * Кодер 1005 * не поддерживается.

Как лучше всего начать конверсию?

Я попытался прочитать файл через fileread() или fread(), чтобы проанализировать файл в MATLAB, но функции, такие как textscan(), также не поддерживаются Coder.

Также похоже на coder.ceval() не может возвращать массивы - по крайней мере, так сказано в руководстве - как должен выглядеть парсер в C ++? Я планировал вернуть вложенный вектор.

1 Ответ

0 голосов
/ 22 января 2020

Если вы используете Coder, после прочтения файла вы можете использовать комбинацию функции MATLAB strtok и coder.ceval для вызова C sscanf для выполнения анализа. Мой ответ здесь показывает пример этого для анализа данных CSV.

Данные

1, 221.34
2, 125.36
3, 98.27

Код

function [idx, temp, outStr] = readCsv(fname)
% Example of reading in 8-bit ASCII data in a CSV file with FREAD and
% parsing it to extract the contained fields.
NULL = char(0);
f = fopen(fname, 'r');
N = 3;
fileString = fread(f, [1, Inf], '*char'); % or fileread
outStr = fileString;
% Allocate storage for the outputs
idx = coder.nullcopy(zeros(1,N,'int32'));
temp = coder.nullcopy(zeros(1,N));
k = 1;
while ~isempty(fileString)
    % Tokenize the string on comma and newline reading an
    % index value followed by a temperature value
    dlm = [',', char(10)];
    [idxStr,fileString] = strtok(fileString, dlm);
    fprintf('Parsed index: %s\n', idxStr);
    [tempStr,fileString] = strtok(fileString, dlm);
    fprintf('Parsed temp: %s\n', tempStr);
    % Convert the numeric strings to numbers
    if coder.target('MATLAB')
        % Parse the numbers using sscanf
        idx(k) = sscanf(idxStr, '%d');
        temp(k) = sscanf(tempStr, '%f');
    else
        % Call C sscanf instead.  Note the '%lf' to read a double.
        coder.ceval('sscanf', [idxStr, NULL], ['%d', NULL], coder.wref(idx(k)));
        coder.ceval('sscanf', [tempStr, NULL], ['%lf', NULL], coder.wref(temp(k)));
    end
    k = k + 1;
end
fclose(f);
...