Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 实现Matlab';s`num2str`在八度音阶中的行为_String_Matlab_Printf_Octave - Fatal编程技术网

String 实现Matlab';s`num2str`在八度音阶中的行为

String 实现Matlab';s`num2str`在八度音阶中的行为,string,matlab,printf,octave,String,Matlab,Printf,Octave,下面的代码 x = [1.1, 2.22, -3.3; 4.44, 5.55, 6.6]; fmt = '%.16g '; y = num2str(x, fmt) 在Matlab(R20105b)中生成不同的结果 和倍频程(4.0.0) 不同之处在于对齐方式:在Matlab中,列是右对齐的,而在倍频程中,列是不对齐的 我想在八度音阶中精确实现Matlab的行为。你知道有什么解决办法吗?当然,我可以编写自己的函数,但可能已经存在一个解决方案 编辑 另一个区别是如何处理多维数组。比如说, x =

下面的代码

x = [1.1, 2.22, -3.3; 4.44, 5.55, 6.6];
fmt = '%.16g ';
y = num2str(x, fmt)
在Matlab(R20105b)中生成不同的结果

和倍频程(4.0.0)

不同之处在于对齐方式:在Matlab中,列是右对齐的,而在倍频程中,列是不对齐的

我想在八度音阶中精确实现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
以八度音阶

y =

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

也就是说,Matlab沿第二维度附加3D切片,沿第一维度附加倍频程。

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

以下仅适用于单个格式化运算符,如示例中所示(它不适用于
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
这在Matlab中以倍频程产生的结果与Matlab中的
y=num2str(x,fmt)
产生的结果相同


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

正是如此!:-)尝试将端口转换为八度。但是
num2str
的行为不同-(我猜您不想估计字段大小……对于固定宽度字段,如果字段足够大,可以容纳整个列,那么输出确实是右对齐的。当然,以下列可能不必要地偏右。此外,从:“
num2str函数不是很灵活。要更好地控制结果,请使用sprintf(请参阅“格式化输出”)。
"…@AndrasDeak问题是,我在MATL中使用了
num2str
,我希望在MATL和Octavec上工作时行为保持一致。请在错误跟踪器上添加一份Matlab兼容性错误报告,以及Matlab和Octave中的一些示例,这些示例可以帮助开发人员调整行为?以及指向此帖子的链接ng…谢谢
y =

8 1 6
3 5 7
4 9 2
-8 -1 -6
-3 -5 -7
-4 -9 -2
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