首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现Matlab的数字2倍频程行为

实现Matlab的数字2倍频程行为
EN

Stack Overflow用户
提问于 2015-12-27 19:22:31
回答 1查看 332关注 0票数 7

以下代码

代码语言:javascript
复制
x = [1.1, 2.22, -3.3; 4.44, 5.55, 6.6];
fmt = '%.16g ';
y = num2str(x, fmt)

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

代码语言:javascript
复制
y =
 1.1 2.22 -3.3
4.44 5.55  6.6

而在八月份(4.0.0)

代码语言:javascript
复制
y =
1.1 2.22 -3.3
4.44 5.55 6.6

不同之处在于对齐:在Matlab中,列是对齐的,而在八度则是不对齐的。

我想准确地实现Matlab的行为在八度。你知道有什么解决办法吗?当然,我可以编写自己的函数,但也许已经有了解决方案。

编辑

另一个不同是如何对待多维数组。例如,

代码语言:javascript
复制
x = cat(3, magic(3), -magic(3));
fmt = '%.16g ';
y = num2str(x, fmt)

在Matlab中生成

代码语言:javascript
复制
y =
8  1  6 -8 -1 -6
3  5  7 -3 -5 -7
4  9  2 -4 -9 -2

在八度

代码语言:javascript
复制
y =

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

也就是说,Matlab将三维切片附加到第二维,而八度则附加在第一维。

EN

回答 1

Stack Overflow用户

发布于 2015-12-27 21:59:21

与其说这是一个解决方案,不如说这是一个解决方案;我对此并不完全满意。但现在开始了。如果有人有更好或更一般的解决方案,请告诉我。

以下内容只适用于单个格式运算符,如示例中所示(它不适用于类似fmt = '%.2f %.1f'的内容),也只适用于真实(不复杂)的数字。它适用于比2维数更多的数组,它模仿Matlab的行为:它将第一个维度以外的所有维度折叠成一个(第二个)维度。

代码语言:javascript
复制
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中的倍频程,与y = num2str(x, fmt)在Matlab中产生的结果相同。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34483961

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档