我想在矩阵中的每个正值之前插入一个空格。
我从:
开始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个字符)。
谢谢!
答案 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> 。