我正在编写一个函数,要求将浮点值转换为字符串以传递到(闭合)C代码中。字符串转换是我的代码中最慢的部分,输入数组可能非常大。 sprintf
速度很快,g
转换字符会产生紧凑的表示形式:
x = [-1.75 0 1 pi 2^57];
sprintf('%.17g ',x)
返回
-1.75 0 1 3.1415926535897931 1.4411518807585587e+17
与指定sprintf
或g
转换字符的G
等效C insignificant zeros are not printed一样。但是,我使用的C代码要求数值包括小数点和尾随零。另一个保持相同精度的选项是:
x = [-1.75 0 1 pi 2^57];
sprintf('%.17f ',x)
返回
-1.75000000000000000 0.00000000000000000 1.00000000000000000 3.14159265358979312 144115188075855872.00000000000000000
但是这会导致字符串数组膨胀(输入向量可能很大且复数值)。
我如何有效和紧凑(速度和内存)将数字打印到字符串,同时根据需要添加尾随零并生成这样的输出?
-1.75 0.0 1.0 3.1415926535897931 1.4411518807585587e+17
理想情况下,这可以直接在格式字符串中完成,以便sprintf
可以完成工作。如果这不起作用,还有哪些其他选项,哪些是最快的? regexprep
太慢了,所以不要考虑它。如果您愿意,可以使用x = repmat([-1.75 0 1 pi 2^57],1e5,1);
作为测试阵列进行计时。
答案 0 :(得分:1)
首先,我定义了我想要使用的格式规范 然后我确定哪个合适并创建格式规范字符串。
x = [-1.75 0 1 pi 2^57];
s = {'%.17g ', '%.1f'};
idx = (x-floor(x) < 0.1 & x < 10^9) + 1;
fspec = reshape(char(s(idx))', 1, []);
给我
>> sprintf(fspec, x)
ans =
-1.75 0.0 1.0 3.1415926535897931 1.4411518807585587e+17