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倍