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

Matlab 如何将一个双精度数组转换为每个字符串长度相同的单元格数组?,matlab,matrix,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'

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

我首先说:

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个字符),无论numb是正值还是负值


谢谢大家!

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

B = arrayfun(@(x) strrep(num2str(x,'%+5.2f'),'+',' '),A,'Uni',false)
如果您的问题长度大致相等,请使用:

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


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

B = arrayfun(@(x) strrep(num2str(x,'%+5.2f'),'+',' '),A,'Uni',false)
如果您的问题长度大致相等,请使用:

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


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

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


说明:

%// 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)

基准测试:

%// 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)


因此,对于
200x100
矩阵,
mat2cell
解决方案几乎比
arrayfun
快20倍
,您可以通过使用
num2str
的精度属性将其直接应用于整个矩阵,从而避免
arrayfun
和矢量化转换:

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


说明:

%// 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)

基准测试:

%// 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)

因此,对于
200x100
矩阵,
mat2cell
解决方案的速度几乎是
arrayfun
的20倍