gpt4 book ai didi

c - MATLAB Coder 动态调整大小的结构数组

转载 作者:太空宇宙 更新时间:2023-11-03 20:29:34 26 4
gpt4 key购买 nike

我正在尝试在一段代码中使用动态增长的结构数组,该代码应该使用 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;
}
}

我想我在声明动态结构时出错了,但不幸的是,文档仅包含声明标准数组动态或预分配结构数组大小的示例,尽管提到支持动态大小调整。任何帮助让它发挥作用的帮助都将不胜感激。

最佳答案

简短的回答:通过索引一个超出末尾的数组来增长数组是 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 支持的结构的最佳方式。

关于c - MATLAB Coder 动态调整大小的结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25889999/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com