matlab中的sprintf:使用紧凑表示,但始终包含尾随零

时间:2013-11-13 01:31:34

标签: string matlab string-formatting printf

我正在编写一个函数,要求将浮点值转换为字符串以传递到(闭合)C代码中。字符串转换是我的代码中最慢的部分,输入数组可能非常大。 sprintf速度很快,g转换字符会产生紧凑的表示形式:

x = [-1.75 0 1 pi 2^57];
sprintf('%.17g ',x)

返回

-1.75 0 1 3.1415926535897931 1.4411518807585587e+17 

与指定sprintfg转换字符的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);作为测试阵列进行计时。

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