matlab - 获取枚举字符串 - matlab编码器

标签 matlab matlab-coder

我有一个这样的枚举:

classdef(Enumeration) bla_type < int32
    enumeration
        bla_one(1)
        bla_2(2)
    end
end

我可以像这样得到“元素的字符串表示”:

char(bla_type.bla_one)

=>

bla_one

不幸的是,matlab coder 不喜欢这样。有没有其他选择?

最佳答案

Coder 中没有优雅的内置方式来执行此操作;枚举类型成为C中的标准枚举,MATLAB中的enumeration函数在Coder中不可用。最简单但不愉快的方法是创建一个函数,其中包含带有手动填充的字符串名称的 switch 语句。这不好,因为现在您必须在两个地方维护名称。

但是,一种行之有效的方法是使用 Coder 的一项更强大的功能:coder.const。

解决方案是创建一个包含枚举成员及其值的表的函数。此函数本身无法编译,而是在编译期间调用以在生成的 C 代码中构建查找表。我们可以在 Coder 兼容函数中使用此查找表来获取数据。

假设我们有一个这样的枚举类型(在 someenum.m 中):

classdef someenum < int32 %#codegen
    enumeration
        First_thing (0)
        Second_thing (2)
        Another_thing (3)
        No_thing (4000)
    end
end

然后我们还有名为“buildsomeenum2name.m”的构建时函数:

function [namearray, memberidx] = buildsomeenum2name
%BUILDSOMEENUM2NAME Compile-time creation of lookup table for someenum 
% THIS FUNCTION IS NOT CODER COMPATIBLE, BUT IS CALLED DURING COMPILE
% TO CREATE A LOOKUP TABLE.

[members, names]=enumeration('someenum');

maxlen = 0;
for i=1:numel(names)
    maxlen = max(maxlen, numel(names{i}));
end

namearray = char(zeros(numel(names), maxlen));
for i=1:numel(names)
    namearray(i, 1:numel(names{i})) = names{i};
end

memberidx =  int32(members); %#ok<NASGU>

end

当在 MATLAB 中调用 buildsomeenum2name 时,它会创建一个包含所有枚举类型成员的字符串名称的数组和另一个按相同顺序排列的数值向量列表。

这是很酷的部分。 MATLAB Coder 可以在构建时评估函数并将它们转换为常量。这些常量在生成的 C 代码中变成文字,而不是实际代码。由于函数是在构建时计算的,枚举信息被放入一个漂亮的表中,因此如果我们制作一个与 Coder 兼容的查找函数,我们可以使用它将成员类型转换为字符串。我们将此函数称为“someenum2name.m”:

function name = someenum2name(enum) %#codegen
%SOMEENUM2NAME Get the string name of an enumerated type

% The following line loads namearray and memberidx with constant arrays
coder.extrinsic('buildsomeenum2name');
[namearray, memberidx] = coder.const(@buildsomeenum2name);

% First find the index of the enumerated type in the memberidx vector

index = find(memberidx==int32(enum));
if isempty(index)
    name = 'UNKNOWN';
    return;
end

name = deblank(namearray(index,:));

end

此函数使用 coder.const 命令在编译时评估 buildsomeenum2name 并创建查找表。我们必须指示 Coder 不要尝试编译 buildsomeenum2name,因此使用 coder.extrinsic 命令告诉它忽略该函数。然后 someenum2name 可以查找字符串的索引并将其拉出(使用 deblank 是因为数组中的字符串尾随 0 需要被拉出。)函数 somenum2name 可以在 MATLAB 和 Coder 编译代码中调用。

此方法使所有内容保持同步,因此如果您向枚举添加新成员或重新排列它们,coder.const 函数将确保在输出代码中重建值,以便 someenum2name 起作用。

在命令行中,这看起来像:

>> someenum2name(someenum.No_thing)
ans =
No_thing

关于matlab - 获取枚举字符串 - matlab编码器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14801207/

相关文章:

Excel 到 matlab 时间戳

matlab - 如何获取鼠标在 Matlab 图形轴上的单击位置?

python - 逻辑: In a 2D data find and remove duplicates and average the y axis results

matlab - 访问视频文件的音频部分

c - 从 VB.Net 读取 MatLab Simulink 值

matlab - matlab中的permute函数是如何工作的

c++ - MATLAB C 生成编码器可以生成适合嵌入式系统的 C 代码吗?

c++ - 使用 Matlab Coder 将 Matlab m 文件转换为 C/C++ 代码,包括 mex 文件 (mxArray)

arrays - 如何识别 MATLAB 中数据存储在数组边界之外的位置?

c - 用于转换特征提取函数的 Matlab 编码器