【问题标题】:Matlab coder num2str not supported不支持 Matlab 编码器 num2str
【发布时间】:2016-04-11 21:27:13
【问题描述】:

我正在尝试使用 Matlab 编码器将 Matlab 项目转换为 C++。我的代码中很少有使用num2str 函数的地方。但是在尝试使用 Matlab 编码器构建项目时,出现以下错误。

“独立代码生成不支持函数‘num2str’。”

我在需要为结构创建字段标识符的情况下使用了这个函数。

例如:

for i=1:numel(bvec)
      fId = ['L', num2str(i)];
      tmp = mystruct.(fId);  
      % do some work here  
end

是否有替代函数 num2str 让我能够转换项目?

【问题讨论】:

  • @excaza 不支持,List of supported functionsfprintf 支持,有很多限制...
  • 好吧,约束并不是那么出乎意料。该函数的行为更像 c 而不是 matlab,因此在大多数情况下,c 调用应该可以解决问题。
  • 你能把它转换成你认为的对应的unicode值吗?你将能够投射它。这有点绕道,但它至少应该有效。不过,这个问题并不难,你可以在一个向量中有一个 unicode 字符列表。在正确的位置设置相应的值,以便调用 uniVec(3) 将返回例如 3 的 unicode 值。此外,您还必须以某种方式处理超过 1 位数字的情况。
  • 你有一个更大的问题,那就是 MATLAB Coder 也不支持动态字段名称。

标签: c++ matlab


【解决方案1】:

使用sprintf 会很容易,但我不确定你是否可以使用它?

fId = sprintf('L%d', i);

如果 numel(bvec) 在 0 到 9 的范围内,您可以使用 char

fId = ['L', char(48+i)];

或者您可以创建自己的数字到字符串的转换函数。可能有更好的方法,但这里有一个想法:

function s = convertnum(n)
   if n > 9
      s = [convertnum(floor(n/10)), char(48+mod(n,10))];
   else
      s = char(48+n);
   end
end

然后像这样使用它:

fId = ['L', convertnum(i)];

编辑

基于 cmets 的另一种转换函数:

function s = convertnum(n)
   s = [];
   while n > 0
      d = mod(n,10);
      s = [char(48+d), s];
      n = (n-d)/10;
   end
end

【讨论】:

  • sprinf 不受支持。否则,将数字转换为 ascii 的好解决方案。但是,它认为一个 for 循环就足够了。这很容易循环,并且不难阅读。这确实是使用递归的唯一原因,因为递归在计算时间方面效率低下是一个已知问题。
  • 谢谢@patrik 我也添加了循环版本。
  • @sclarke81 是的。它正在工作。这是目前对我来说最好的解决方案。谢谢
  • @sclarke81 哎呀.. 现在我在代码生成准备问题中遇到了一个新问题。 “代码生成目前不支持像 convertnum.m 这样的递归函数。”
  • 这很可能是唯一的解决方案。这对它来说真的没有什么魔力。这是创建 char 的最基本方法,它基于 char 在内存中的存储方式。
【解决方案2】:

我为Matlab2016a Coder写了如下代码替换num2str,它也支持双精度:

function str = DoubleArray2String(x)
    str_cell=cell(1,length(x));
    for i=1:length(x)
        n = x(i);
        l = fix(n);
        r = n-l;
        str_cell{i} = strjoin({Double2String(l),Reminder2String(r)},'.');
    end
    str = strjoin(str_cell,',');
end

function str = Double2String(n)
    str = '';
    while n > 0
        d = mod(n,10);
        str = [char(48+d), str];
        n = (n-d)/10;
    end
    if isempty(str)
        str='0' ;
    end
end

function str = Reminder2String(n)
    str = '';
    while (n > 0) && (n < 1)
        n = n*10;
        d = fix(n);
        str = [str char(48+d)];
        n = n-d;
    end
    if isempty(str)
        str='0' ;
    end
end

【讨论】:

    【解决方案3】:

    可以在 C++ 中使用 to_string 编写与 Matlab 的 num2str 等效的函数。请查看我的函数版本:

    #include"stdafx.h"
    #include <sstream>
    #include <string.h>
    
    using namespace std;
    
    string num2str(int number)
    {
        string s;
        s = to_string(number);
        return s;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-21
      • 2013-03-31
      • 2021-10-24
      • 2011-11-12
      • 2014-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多