在Octave中实现Matlab的`num2str`行为

7
以下是代码示例:
x = [1.1, 2.22, -3.3; 4.44, 5.55, 6.6];
fmt = '%.16g ';
y = num2str(x, fmt)

在 Matlab (R20105b) 中会产生不同的结果。

y =
 1.1 2.22 -3.3
4.44 5.55  6.6

在Octave(4.0.0)中

y =
1.1 2.22 -3.3
4.44 5.55 6.6

区别在于对齐方式:在Matlab中,列是右对齐的,而在Octave中它们没有对齐。

我希望在Octave中实现与Matlab完全相同的行为。你知道有什么解决方案吗?当然,我可以编写自己的函数,但也许已经存在解决方案。

编辑

另一个区别是如何处理多维数组。例如,

x = cat(3, magic(3), -magic(3));
fmt = '%.16g ';
y = num2str(x, fmt)

在Matlab中生成

y =
8  1  6 -8 -1 -6
3  5  7 -3 -5 -7
4  9  2 -4 -9 -2

在Octave中
y =

8 1 6
3 5 7
4 9 2
-8 -1 -6
-3 -5 -7
-4 -9 -2

即Matlab沿第二维连接3D切片,而Octave沿第一维连接。

3
没错! :-) 我正试着将它移植到Octave上。但是 num2str 的行为不同了! :-( - Luis Mendo
我猜你不想估计字段大小...对于固定宽度的字段,如果该字段足够大以容纳整个列,则输出确实是右对齐的。但是接下来的列可能会不必要地向右移动。 - Andras Deak -- Слава Україні
1
另外,从sourceforge文档中可以得知: "num2str函数的灵活性不是很高。为了更好地控制结果,请使用sprintf(参见“格式化输出”)。" - Andras Deak -- Слава Україні
问题是,我在MATL中使用num2str,并希望在Matlab和Octave上的行为保持一致。 - Luis Mendo
1
请您在错误跟踪器上添加一个Matlab兼容性错误报告,并提供一些来自Matlab和Octave的示例,以帮助开发人员适应行为。还请提供此帖子的链接...谢谢。 - Andy
显示剩余10条评论
1个回答

2
这更像是一个解决方法而不是一个解决方案;我对它并不完全满意。但是,以下是解决方法。如果有更好或更通用的解决方案,请告诉我。
以下仅适用于单个格式化运算符,例如示例中的情况(不适用于类似于fmt = '%.2f %.1f'的内容),仅适用于实数(而非复数)。它适用于具有多个维度的数组,模仿Matlab的行为:将第一维以外的所有维度折叠成单个(第二)维度。
if ischar(x)
    y = x;
else
    y = sprintf([fmt '\n'], reshape(x,size(x,1),[]).'); %'// each row of y is a string.
                                                        % // '\n' is used as separator
    y = regexp(y, '\n', 'split'); %// separate
    y = y(1:end-1).'; %'// remove last '\n'
    y = cellfun(@fliplr, y, 'uniformoutput', false); %// invert each string
    y = char(y); %// concatenate the strings vertically. This aligns to the left
    y = fliplr(y); %// invert back to get right alignment
    y = reshape(y.',[],size(x,1)).'; %// reshape into the shape of x
    y = strtrim(y); %// remove leading and trailing space, like num2str does
end

这将在Matlab和Octave中产生与y = num2str(x, fmt)相同的结果。

需要注意的是,当第一个输入为字符数组时,num2str忽略第二个输入(格式说明符),并在Matlab和Octave中生成相同的字符数组作为输出。因此,num2str('abc', '%f ')会产生'abc'。然而,sprintf的工作方式不同:它强制使用格式说明符,必要时将输入的字符解释为ASCII码。这就是为什么上面的代码需要if分支的原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接