2013-03-13 178 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