如何将双精度数组转换为每个具有相同长度的字符串单元格数组?

时间:2015-04-04 19:14:31

标签: matlab matrix

我想在矩阵中的每个值之前插入一个空格。

我从:

开始
A =
     1.0000   -0.2176    0.3766
    -0.2176    1.0000    0.3898
    -0.3766    0.3898    1.0000

我将一个函数应用于A的每个值:

B = arrayfun(@(x) num2str(x,'% 5.2f'),A,'UniformOutput',0)

输出就是这样:

B = 
    '1.00'     '-0.22'    '0.38'
    '-0.22'    '1.00'     '0.39' 
    '-0.38'    '0.39'     '1.00'

但是,我希望输出为:

B = 
    ' 1.00'     '-0.22'    ' 0.38'
    '-0.22'     ' 1.00'    ' 0.39' 
    '-0.38'     ' 0.39'    ' 1.00'

请注意,无论麻木是阳性还是阴性,每个细胞都具有相同宽度(5个字符)。

谢谢!

2 个答案:

答案 0 :(得分:4)

插入相同长度的加号,然后将其替换为空白

B = arrayfun(@(x) strrep(num2str(x,'%+5.2f'),'+',' '),A,'Uni',false)

如果您的问题长度相等,请使用:

B = arrayfun(@(x) num2str(x,'%+5.2f'),A,'Uni',false)

B = arrayfun(@(x) num2str(x,'%05.2f'),A,'Uni',false)

答案 1 :(得分:1)

您可以通过使用arrayfun的precision属性直接将其应用于整个矩阵来避免num2str并对转换进行矢量化:

prec = 2
B = mat2cell(num2str(A,'%+5.2f'), ones(size(A,1),1), (prec+3).*ones(size(A,2),1))

B = 

    '+1.00'    '-0.22'    '+0.38'
    '-0.22'    '+1.00'    '+0.39'
    '-0.38'    '+0.39'    '+1.00'

<强>解释

%// apply num2str to whole matrix with precision property
charArray = num2str(A,'%+5.2f');
%// reshape resulting char array
B = mat2cell(charArray, [1 1 1], [3+2 3+2 3+2])
%// which is generically
B = mat2cell(charArray, ones(size(A,1),1), (prec+3).*ones(size(A,2),1))

<强>基准:

f1 = @() mat2cell(num2str(A,'%+5.2f'), ones(size(A,1),1), (prec+3).*ones(size(A,2),1));
f2 = @() arrayfun(@(x) num2str(x,'%+5.2f'),A,'Uni',false);

t1 = timeit(f1)
t2 = timeit(f2)

t1 =   0.25875  %// mat2cell
t2 =   4.2812   %// arrayfun

因此对于200x100矩阵,mat2cell解决方案比arrayfun快<20> 。