2013-03-13 175 views
2

我的問題:我有一個數組類型char的A,讀取這樣的:MATLAB - 將數字字符數組轉換爲數字整數數組/矩陣?

196800271010 
902589451069 
052068830384 
901778191098 

我想打開阿到將字符分離成單個的數目的整數,像這樣的數值矩陣

[1 9 6 8 0 0 2 7 1 0 1 0 
9 0 2 5 8 9 4 5 1 0 6 9 
0 5 2 0 6 8 8 3 0 3 8 4 
9 0 1 7 7 8 1 9 1 0 9 8] 

這是什麼最好的方法? 我試過 str2num(A),但對待字符每行一個整數(即第一行是1.9680) 我也試過這個for循環

for i = 1:5 %the number of rows in the char array 
    s = num2str(A(i,:)); 
    for t = length(s):-1:1 
     result(t) = str2num(s(t)); 
    end 
end 

但這只是返回數組的最後一行,我想要所有這些。

回答

0

我不知道你爲什麼要轉換兩次。只需通過兩個索引並轉換每個字符並將其放入新矩陣。

for i = 1:size(A,1) 
    for t = 1:size(A,2) 
     result(i,t) = str2num(A(i,t)); 
    end 
end 

PS:預分配result befoor環路將增加速度:

result = zeros(size(A)) 
4

如果您將您的矩陣成列向量,每個角色將定位於不同的行,以便它可以是由str2num獨立處理。然後reshape回:

result = reshape(str2num(A(:)), size(A)) 
0

矩陣RESULT1是你想要的。

enter image description here

+1

請不要將代碼作爲屏幕截圖發佈,一個簡單的剪切和粘貼會做。 – 2013-03-13 21:18:55

+0

@EitanT明白了。謝謝! – tqjustc 2013-03-14 00:21:42

0

埃坦T的答案可能是最好的。它更乾淨,可能更快。但是有一些相關的索引問題需要指出。

如果您知道輸入字符都是數字,您可以使用Unicode字符值的技巧,使用字符'0'到'9'是連續的。

result = double(A) - double('0'); 

你的原代碼幾乎作品,除非你沒有到結果使用i索引,所以你改寫同一行上分別通過該外環。使用這兩個索引,結果將得到正確的形狀。

for i = 1:5 %the number of rows in the char array 
    s = num2str(A(i,:)); 
    for t = length(s):-1:1 
     result(i,t) = str2num(s(t)); 
    end 
end 

這會得到你想要的輸出。但有些問題稍後會出現。 num2str()調用是多餘的,因爲數據已經是char;你可以刪除它。您可以使用A(i,t)而不是s。並且str2double通常比str2num更快和更安全,因爲str2num在幕後調用eval

但是,您也可以在一個循環中迭代多維數組中的每個元素。這是一個更一般的方法。當您使用單個索引時,Matlab將線性索引到數組中,而不管其維數如何。

result = NaN(size(s)); 
for i = 1:numel(s) 
    result(i) = str2double(s(i)); 
end