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 【问题描述】:

我需要将一个使用.csvs 通过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 sscanfcoder.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++ 可执行文件

MATLAB Coder 函数在 2014a 中未定义

详细步骤讲解matlab代码通过Coder编译为c++并用vs2019调用

在 Visual Studio 或 g++ 上运行 Matlab Coder 输出项目

预期标量值:MATLAB Coder