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

问题描述:

我想在矩阵中的每个正数值之前插入一个空格。如何将双精度数组转换为每个长度相同的字符串数组?

我开始:

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个字符)。

谢谢!

插入加上长度相等,然后用空白

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) 

您可以避免使用arrayfun,并使用01的精度属性向量化该转换将它应用到直接全矩阵:

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倍