gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 19:29:54 24 4
gpt4 key购买 nike

下面的代码

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。

最佳答案

这与其说是解决方案,不如说是一种变通方法;我对此并不完全满意。但事情就是这样。如果有人有更好或更通用的解决方案,请告诉。

以下仅适用于单一格式化运算符,如示例所示(不适用于 fmt = '%.2f %.1f' ),并且仅适用于实数(非复数)。它适用于维度超过 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

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

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

关于string - 在 Octave 中实现 Matlab 的 `num2str` 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34483961/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com