主要内容

coder.read

运行时在生成的代码中读取数据文件

自 R2023a 起

    说明

    在您打算为其生成 C/C++ 代码的 MATLAB® 代码中,使用 coder.read 函数从 .coderdata 文件中读取数据。生成的代码在运行时执行数据读取。

    要将数据存储在 .coderdata 文件中,请在 MATLAB 执行中使用 coder.write 函数。

    每个 .coderdata 文件都包含一个类型头,用于指定该文件中存储的数据的类型和大小。coder.read 函数在解释文件内容时使用此信息。

    dataFromFile = coder.read(filename)filename.coderdata 存储文件中读取并返回存储在文件中的数据。此语法仅适用于常量 filename 输入。在代码生成期间,此名称表示的文件必须存在于您的当前文件夹中

    在运行生成的代码之前,您可以使用 coder.write 函数来更改 filename.coderdata 中包含的数据。但是,filename.coderdata 中包含的数据的类型和大小在代码生成时和运行时必须相同。

    示例

    dataFromFile = coder.read(filename,TypeHeaderFrom=typeHeaderFilename) 使用 typeHeaderFilename 中包含的类型和大小信息来解释 filename 中的数据。typeHeaderFilename 参量必须在代码生成时为常量,并且在代码生成期间,此名称表示的文件必须存在于您的当前文件夹中。代码生成器在代码生成时从 typeHeaderFilename 获取类型和大小信息。

    coder.read 函数生成的代码可以在运行时读取任何 .coderdata 文件,前提是所包含数据的类型和大小与您在代码生成时使用 typeHeaderFilename 文件提供的类型和大小信息一致。

    示例

    [dataFromFile,errID] = coder.read(___) 隐藏读取操作期间的运行时错误。如果发生任何错误,coder.read 将第一个错误返回为 errIDdataFromFile 参量返回不可用的文件内容。使用此语法测试为禁用了运行时错误的目标生成的代码。

    示例

    全部折叠

    使用 coder.write 创建一个 .coderdata 文件,该文件存储您的 MATLAB 工作区中的单精度数组。然后为在运行时读取该文件的 coder.read 函数调用生成代码。

    在您的工作区中创建一个类型为 double 的 100×100 数组。

    data = rand(100);

    将此变量存储在当前文件夹中名为 exampleData.coderdata 的文件中。

    coder.write('myfile.coderdata',data);
    Wrote file 'myfile.coderdata'. You can read this file with 'coder.read'.

    要读取具有常量文件名 exampleData.coderdata 文件,请使用具有单个输入参量的 coder.read 函数语法。

    function y = my_entry_point(x) %#codegen
    dataOut = coder.read('myfile.coderdata');
    y = x + mean(dataOut,"all");
    end

    生成 MEX 函数 my_entry_point_mex,然后通过运行以下命令调用生成的 MEX:

    codegen my_entry_point -args {0}
    my_entry_point_mex(1)
    Code generation successful.
    
    ans =
    
        1.4996

    现在,您可以将存储在 myfile.coderdata 中的数据更新到另一个类型为 double 的 100×100 数组。如果您随后调用已生成的 my_entry_point_mex,MEX 现在会读取并使用新数据。

    d = rand(100) - 1;
    coder.write('myfile.coderdata',d);
    my_entry_point_mex(1)
    Wrote file 'myfile.coderdata'. You can read this file with 'coder.read'.
    
    ans =
    
        0.4963

    coder.read 命令生成代码,该命令可以在运行时读取多个 .coderdata 文件。这些文件包含类型相同但大小不同的数组数据。要使单个 coder.read 调用能够读取所有这些文件,请将与所有单个数据文件一致的类型头文件传递给 coder.read 函数调用。

    首先,创建希望生成代码读取的存储文件。在命令行中,创建变量 var_avar_b,它们的类型都为 double,但大小不同。使用 coder.write 函数将数组 var_a 和数组 var_b 分别存储在文件 file_a.coderdatafile_b.coderdata 中。

    var_a = rand(10,20);
    var_b = rand(5,30);
    coder.write("file_a.coderdata",var_a)
    coder.write("file_b.coderdata",var_b)
    Wrote file 'file_a.coderdata'. You can read this file with 'coder.read'.
    Wrote file 'file_b.coderdata'. You can read this file with 'coder.read'.

    与变量 var_avar_b 都一致的 coder.Type 对象必须具有可变大小维度。这两个数组维度的上界必须分别至少为 10 和 30。创建一个 coder.Type 对象,该对象具有可变大小,类型为 double,且具有这些边界。

    t = coder.typeof(var_a,[10 30],[1 1])
    t = 
    
    coder.PrimitiveType
       :10×:30 double

    修改 file_a.coderdata 的头信息,使其与数组 var_avar_b 都兼容。您可以将修改后的文件用作所需的公共类型头文件。

    coder.write("file_a.coderdata",a,TypeHeader=t);
    Wrote file 'file_a.coderdata'. You can read this file with 'coder.read'.

    创建一个可以读取 file_a.coderdatafile_b.coderdata 的 MATLAB 入口函数 readMultipleFiles

    function data = readMultipleFiles(filename) %#codegen
    data = coder.read(filename,TypeHeaderFrom="file_a.coderdata");
    end

    readMultipleFiles 生成一个 MEX 函数。将输入参量类型指定为无界可变大小字符向量,以便它可以表示任意长度的文件名。

    codegen readMultipleFiles -args {coder.typeof('a',[1 inf])} -report
    Code generation successful: View report

    使用输入 'file_a.coderdata''file_b.coderdata' 运行生成的 MEX 函数。

    readMultipleFiles_mex('file_a.coderdata');
    readMultipleFiles_mex('file_b.coderdata');

    输入参数

    全部折叠

    要从中读取数据的 .coderdata 存储文件的名称,指定为字符串标量或字符向量。

    要将数据存储在 .coderdata 文件中,请使用 MATLAB 中的 coder.write 函数。

    存储要在运行时读取的文件的类型和大小信息的 .coderdata 文件的名称,指定为字符串标量或字符向量。typeHeaderFilename 必须在代码生成时为常量。

    每个 .coderdata 文件都包含一个类型头,用于指定该文件中存储的数据的类型和大小。为 coder.read 函数生成的代码可以在运行时读取任何 .coderdata 文件,前提是所包含数据的类型和大小与您在代码生成时使用 typeHeaderFilename 文件提供的类型和大小信息一致。此文件也称为类型头文件

    要创建一个类型头文件,请使用 MATLAB 中的 coder.write 函数。

    输出参量

    全部折叠

    .coderdata 存储文件中读取的数据,以存储在结构体或元胞数组中的一个或多个数组形式返回。

    数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical | char | string | struct | cell | categorical | sparse

    读取错误枚举对象,指定为以下值之一。

    枚举成员枚举值错误引用
    Success0

    读取操作成功。

    CoderReadCouldNotOpen1

    无法打开指定的 .coderdata 文件。

    CoderReadProblemReading2

    读取 .coderdata 文件时出现问题。

    CoderReadUnexpectedValue3

    .coderdata 文件中有意外值。

    CoderReadWrongHeader4

    .coderdata 文件不包含预期的元数据。输入文件可能已损坏或者不是 .coderdata 文件。请使用 coder.write 创建 .coderdata 文件。

    CoderReadWrongVersion5

    .coderdata 文件与 MATLAB Coder™ 的当前版本不兼容。使用产品的当前版本创建一个新的 .coderdata 文件以生成兼容文件。

    CoderReadStructArray6

    需要读取标量结构体,但 .coderdata 文件包含结构体数组。请提供兼容的 TypeHeaderFrom 参量来读取此文件。或者,使用只接受一个常量 filename 输入的第一种语法。

    MATFile7

    不支持使用 coder.read 读取 MAT 文件。通过在命令行窗口中运行以下命令,将 MAT 文件转换为 .coderdata 文件:

    s = load("MATFileName");
    coder.write("filename.coderdata",s);

    使用 coder.read 读取新的 .coderdata 文件。

    WrongType8

    .coderdata 文件的类型信息与 TypeHeaderFrom 参量指定的类型信息不兼容。

    扩展功能

    全部展开

    C/C++ 代码生成
    使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。

    版本历史记录

    在 R2023a 中推出