以下代码
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切片,沿着第一维附加八度切片。
答案 0 :(得分:2)
这是一种解决方法而不是解决方案;我并不完全满意。但在这里它。如果有人有更好或更一般的解决方案,请告诉我们。
以下内容仅适用于单一格式化运算符,如示例所示(它不适用于fmt = '%.2f %.1f'
),仅适用于 real(不复杂的数字。它适用于具有超过2
维度的数组,模仿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中产生的结果与Matlab中y = num2str(x, fmt)
产生的结果相同。
应该注意的是,当第一个输入是char数组num2str
时,忽略第二个输入(格式说明符)并在Matlab和Octave中产生相同的char数组作为输出。因此num2str('abc', '%f ')
生成'abc'
。但是,sprintf
的工作方式不同:它强制使用格式说明符,如果需要,将输入的字符解释为ASCII代码。这就是上述代码中需要if
分支的原因。