2015-04-04 104 views
1

我想在矩陣中的每個正數值之前插入一個空格。如何將雙精度數組轉換爲每個長度相同的字符串數組?

我開始:

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

謝謝!

回答

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

您可以避免使用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倍

相關問題