2014-08-27 85 views
2

我想通過使用Matlab編碼器將Matlab項目轉換爲C++。我在代碼中有幾個地方使用了num2str函數。但是,當試圖使用Matlab編碼器來構建項目時,出現以下錯誤。不支持Matlab編碼器num2str

「函數'num2str'不支持獨立代碼生成。」

我在需要爲結構創建字段標識符的情況下使用了這個函數。

如:

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

是否有功能num2str替代對我來說,能夠轉換項目?

+0

@excaza那不是支持,[一覽支持的功能](http://www.mathworks.co.uk/help/simulink/ug/functions-supported-for-code-generation-alphabetical-list.html),['fprintf'](http:// www.mathworks.co.uk/help/matlab/ref/fprintf.html)被支持,有很多的限制... – RTL 2014-08-27 12:36:13

+0

那麼,約束並不是那麼出乎意料。該函數的行爲更像c而不是matlab,所以在大多數情況下,一個c調用應該能夠做到這一點。 – patrik 2014-08-27 13:04:28

+1

你能把它轉換成你認爲對應的unicode值嗎?你將能夠施放它。這有點繞道,但至少應該起作用。這個問題不是很困難,你可以在矢量中有一個unicode字符列表。例如,在相應的位置設置相應的值,以便調用'uniVec(3)'將返回3的unicode值。你也必須以某種方式處理超過1位數字的情況。 – patrik 2014-08-27 13:19:57

回答

2

使用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)]; 

編輯

另一種轉換功能基於評論:

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

'sprinf'不支持。否則,很好的解決方案將數字轉換爲ascii。但是,它認爲for循環就足夠了。這很容易循環,並且不會難以閱讀。這實際上是使用遞歸的唯一原因,因爲在計算時間方面,遞歸的效率低下是一個已知的問題。 – patrik 2014-08-27 14:29:16

+1

謝謝@patrik我也添加了一個循環版本。 – sclarke81 2014-08-27 14:40:43

+0

@ sclarke81是的。它正在工作。這對我來說目前是最好的解決方案。謝謝 – suranga 2014-08-27 15:20:05

0

Matlab的一個函數可以使用C++中的to_string編寫。請看看我的版本的功能:

#include"stdafx.h" 
#include <sstream> 
#include <string.h> 

using namespace std; 

string num2str(int number) 
{ 
    string s; 
    s = to_string(number); 
    return s; 
} 
1

我寫了Matlab2016a編碼器下面的代碼替換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