MATLAB 到 C++:MATLAB Coder 不支持 csvread()
Posted
技术标签:
【中文标题】MATLAB 到 C++:MATLAB Coder 不支持 csvread()【英文标题】:MATLAB to C++: csvread() not supported by MATLAB Coder 【发布时间】:2020-01-21 20:56:09 【问题描述】:我需要将一个使用.csv
s 通过csvread()
读写配置和数据的 MATLAB 脚本移植到 C++。
显而易见的选择是在 MATLAB 中使用 Coder 应用,但 Coder 不支持 csvread()
。
实现转化的最佳行动方案是什么?
我尝试通过fileread()
或fread()
读取文件以在MATLAB 中解析文件,但Coder 也不支持textscan()
等函数。
另外,coder.ceval()
似乎无法返回数组——至少手册上是这样说的——解析器在 C++ 中的外观如何?我正计划返回一个嵌套向量。
【问题讨论】:
我打算返回一个嵌套向量 FWIW,不要那样做。不应使用 ND 向量,因为它们缺乏数据局部性。如果您需要 ND 向量,请将一维向量包装在一个类中并使用数学来假装它具有多个维度(或者只是获取一个已经这样做的库) 这是一个非常简单的 2D 示例,说明 Nathan 所说的内容][(***.com/a/2076668/4581301) 您是否考虑改用 MATLAB 编译器?无需生成代码,但您仍然可以与没有 MATLAB 许可证的用户共享您的软件。 @Daniel 我做到了,但这将是我的最后一个选择,因为我将需要我的 cpp 代码中某些脚本的输出/结果(例如,其中一个脚本会根据每个脚本进行图像比较) -像素基础并返回可能性百分比 - 我需要在进一步计算中使用这个可能性值) 您可以使用 MATLAB 编译器生成 C++ 共享库,以便在其他代码中使用结果:mathworks.com/help/compiler_sdk/gs/… 【参考方案1】:如果您打算使用 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);
【讨论】:
非常感谢,我实际上已经看到了您链接到的主题,但由于某种原因跳过了它。我设法使其适应我的需要,但是,coder.wref(temp(k))
抛出 Dimensions of arrays being concatenated are not consistent.
我将在这个问题上打开一个新主题。
对于遇到此问题的人来说也是一个提示:线性索引(例如temp(k)
)导致 csv 被写入行优先,因此可能需要转置结果,就像在我的情况。以上是关于MATLAB 到 C++:MATLAB Coder 不支持 csvread()的主要内容,如果未能解决你的问题,请参考以下文章
使用 MATLAB coder 将代码从 Registration Estimator 应用程序导出到 C++
详细步骤讲解matlab代码通过Coder编译为c++并用vs2019调用