Dynamic size table with MATLAB coder

조회 수: 8 (최근 30일)
Diogo Tecelão
Diogo Tecelão 2020년 11월 29일
답변: Siddharth Bhutiya 2020년 12월 9일
Hi all,
I'm intend to convert my feature extraction code into C using MATLAB coder, but I'm facing trouble when trying to aggregate the features in a table. I've created a reproductible code which raises my error:
function t = table_concat_test
t = table();
for i=1:10
features = struct();
features.a = 1;
features.b = 2;
features.c = 3;
features.d = 4;
extra_info = struct();
extra_info.name = "name";
extra_info.age = 19;
t = [t; struct2table(features) struct2table(extra_info)];
end
end
When I run the compile comamnd:
codegen table_concat_test
I get the following error:
??? Code generation does not support table arrays.
I was able to solve this error with the following changes:
t_temp = [t; struct2table(features) struct2table(extra_info)];
t = t_temp;
But now I get another different error:
??? The value of non-tunable property 'rowDim.length' does not match.
Any idea how I can do this? Thanks!

답변 (1개)

Siddharth Bhutiya
Siddharth Bhutiya 2020년 12월 9일
The error seems to suggest that you are assigning conflicting values to your table variable 't'. This might be happening because you are reusing the same variable name 't' to mean different tables during each iteration. Something like this would be the obvious thing to do in MATLAB but, since you are generating C code, things are slightly different there. One way to make this work would be to create a cell array of the sub tables and then concatenate them in one call after the loop.
function t = table_concat_test
temp = cell(1,10);
for i=1:10
features = struct();
features.a = 1;
features.b = 2;
features.c = 3;
features.d = 4;
extra_info = struct();
extra_info.name = {'name'};
extra_info.age = 19;
temp{i} = [struct2table(features) struct2table(extra_info)];
end
t = vertcat(temp{:});
end
>> codegen table_concat_test
Code generation successful.
>> table_concat_test_mex
ans =
10×6 table
a b c d name age
_ _ _ _ ________ ___
1 2 3 4 {'name'} 19
1 2 3 4 {'name'} 19
1 2 3 4 {'name'} 19
1 2 3 4 {'name'} 19
1 2 3 4 {'name'} 19
1 2 3 4 {'name'} 19
1 2 3 4 {'name'} 19
1 2 3 4 {'name'} 19
1 2 3 4 {'name'} 19
1 2 3 4 {'name'} 19
Note that I had to change extra_info.name to a cellstr instead of string, since MATLAB unfortunately does not support code generation for string arrays at this point.

카테고리

Help CenterFile Exchange에서 Structures에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by