【问题标题】:MATLAB Coder dynamically sized array of structsMATLAB Coder 动态大小的结构数组
【发布时间】:2014-11-11 10:56:43
【问题描述】:

我正在尝试在一段应该使用 Coder 转换为 C 的代码中使用动态增长的结构数组:

我初始化结构,然后为编码器声明它的字段可变大小,然后我继续增长结构。请注意,我已简化此示例以帮助生成代码的可读性,因此我使用结构数组的原因在此示例中并不明显。

MATLAB:

function [ events ] = testArraysOfStructs( data)
//%#codegen

ii=1;
events = struct('typ'   ,int32(0),...
                'title' ,int32(1),...
                'value' ,double(0),...
                'sta'   ,int32(2),...
                'end'   ,int32(3));

coder.varsize('events','events.typ','events.title','events.value','events.sta','events.end','events.title')

for n=1:length(data.temperatur_spikes_daily)

    events(ii).typ      = int32(101);
    events(ii).title    = int32(1234);
    events(ii).value    = double(1234);
    events(ii).sta      = int32(4321);
    events(ii).end      = int32(3412);

    ii = length(events)+1;
end
end

问题是,在生成的代码中,变量ii 消失了,数据被连续写入结构的相同数组元素,而不考虑应该增长它的循环的迭代次数。

C:

void testArraysOfStructs(const struct0_T *data, struct1_T events_data[], int
  events_size[2])
{
  struct1_T r0;
  int n;
  r0.typ.size[0] = 1;
  r0.typ.size[1] = 1;
  r0.typ.data[0] = 0;
  r0.title.size[0] = 1;
  r0.title.size[1] = 1;
  r0.title.data[0] = 1;
  r0.value.size[0] = 1;
  r0.value.size[1] = 1;
  r0.value.data[0] = 0.0;
  r0.sta.size[0] = 1;
  r0.sta.size[1] = 1;
  r0.sta.data[0] = 2;
  r0.end.size[0] = 1;
  r0.end.size[1] = 1;
  r0.end.data[0] = 3;
  events_size[0] = 1;
  events_size[1] = 1;
  events_data[0] = r0;
  for (n = 0; n < data->temperatur_spikes_daily->size[0]; n++) {
    events_data[0].typ.size[0] = 1;
    events_data[0].typ.size[1] = 1;
    events_data[0].typ.data[0] = 101;
    events_data[0].title.size[0] = 1;
    events_data[0].title.size[1] = 1;
    events_data[0].title.data[0] = 1234;
    events_data[0].value.size[0] = 1;
    events_data[0].value.size[1] = 1;
    events_data[0].value.data[0] = 1234.0;
    events_data[0].sta.size[0] = 1;
    events_data[0].sta.size[1] = 1;
    events_data[0].sta.data[0] = 4321;
    events_data[0].end.size[0] = 1;
    events_data[0].end.size[1] = 1;
    events_data[0].end.data[0] = 3412;
  }
}

我想我在声明动态结构时出错,但不幸的是,文档仅包含用于声明标准数组动态或预分配结构数组大小的示例,即使提到支持动态调整大小也是如此。任何帮助使其工作的帮助将不胜感激。

【问题讨论】:

    标签: c matlab code-generation matlab-coder


    【解决方案1】:

    简答:使用 Coder 通过索引一个超出末尾的数组来增长数组是 not supported

    因此,Coder 不支持在每次迭代时增加 events 大小的循环。你可以使用:

    function [ events ] = foo(data)
    %#codegen
    
    events = struct('typ'   ,int32(0),...
                    'title' ,int32(1),...
                    'value' ,double(0),...
                    'sta'   ,int32(2),...
                    'end'   ,int32(3));
    
    for n = 1:length(data.temperatur_spikes_daily)
        events = [events, struct('typ'   ,int32(101),...
                    'title' ,int32(1234),...
                    'value' ,double(1234),...
                    'sta'   ,int32(4321),...
                    'end'   ,int32(3412))];
    end
    

    或:

    function [ events ] = foo(data)
    %#codegen
    % Allocate events
    s = struct('typ'   ,int32(0),...
        'title' ,int32(1),...
        'value' ,double(0),...
        'sta'   ,int32(2),...
        'end'   ,int32(3));
    events = coder.nullcopy(repmat(s, 1, length(data.temperatur_spikes_daily)));
    
    % Populate values of events
    for n = 1:numel(events)
        events(n).typ      = int32(101);
        events(n).title    = int32(1234);
        events(n).value    = double(1234);
        events(n).sta      = int32(4321);
        events(n).end      = int32(3412);
    end
    

    改为。

    如果您从原始代码而不是独立代码生成 MEX 函数并在 MATLAB 中运行此 MEX 函数,您将收到错误消息:

    Index exceeds matrix dimensions.  Index value 2 exceeds valid range [1-1] of array events.
    
    Error in foo (line 15)
        events(ii).typ      = int32(101);
    

    生成和运行 MEX 函数是验证您的 MATLAB 代码是否使用 Coder 支持的构造的最佳方式。

    【讨论】:

    • 我想我误读了他们写的关于结构数组的动态字段的内容。您的第一个建议看起来可能对我有用。一旦我尝试过,我会接受答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 2017-07-02
    相关资源
    最近更新 更多