如何将双精度数组转换为每个长度相同的字符串数组?
问题描述:
我想在矩阵中的每个正数值之前插入一个空格。如何将双精度数组转换为每个长度相同的字符串数组?
我开始:
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倍。