MATLAB 到 C++:MATLAB Coder 不支持 csvread()
MATLAB to C++: csvread() not supported by MATLAB Coder
我需要将一个 MATLAB 脚本移植到 C++,该脚本使用 .csv
s 来读写配置和数据 csvread()
。
显而易见的选择是在 MATLAB 中使用 Coder 应用程序,但 csvread()
不受 Coder 支持。
进行转换的最佳行动方案是什么?
我尝试通过 fileread()
或 fread()
读取文件以在 MATLAB 中解析文件,但 Coder 也不支持像 textscan()
这样的函数。
而且 coder.ceval()
似乎不能 return 数组 - 至少手册是这样说的 - 解析器在 C++ 中应该是什么样子?我正计划 return 嵌套向量。
如果您打算使用 Coder,在阅读文件后,您可以结合使用 MATLAB 函数 strtok
和对 C sscanf
的 coder.ceval
调用做解析。我的回答 here 展示了一个解析 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);
我需要将一个 MATLAB 脚本移植到 C++,该脚本使用 .csv
s 来读写配置和数据 csvread()
。
显而易见的选择是在 MATLAB 中使用 Coder 应用程序,但 csvread()
不受 Coder 支持。
进行转换的最佳行动方案是什么?
我尝试通过 fileread()
或 fread()
读取文件以在 MATLAB 中解析文件,但 Coder 也不支持像 textscan()
这样的函数。
而且 coder.ceval()
似乎不能 return 数组 - 至少手册是这样说的 - 解析器在 C++ 中应该是什么样子?我正计划 return 嵌套向量。
如果您打算使用 Coder,在阅读文件后,您可以结合使用 MATLAB 函数 strtok
和对 C sscanf
的 coder.ceval
调用做解析。我的回答 here 展示了一个解析 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);