MATLAB - 将数字字符数组转换为数字整数数组/矩阵?

时间:2013-03-13 16:08:31

标签: arrays matlab char

我的问题:我有一个类型为char 的数组,其内容如下:

196800271010
902589451069
052068830384
901778191098

我想把A变成一个数字矩阵,将字符分成单个数字整数,如此

[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 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

但这只是返回数组的最后一行,我希望拥有所有这些。

4 个答案:

答案 0 :(得分:4)

如果将矩阵转换为列向量,则每个字符将位于不同的行中,以便str2num可以独立处理。然后reshape返回:

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

答案 1 :(得分:0)

我不知道你为什么要转换两次。只需浏览两个索引并转换每个char并将其放入新矩阵中。

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

PS:预先分配result循环会增加速度:

result = zeros(size(A))

答案 2 :(得分:0)

矩阵 result1 就是你想要的。

enter image description here

答案 3 :(得分:0)

Eitan 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在幕后调用str2numstr2num通常比eval更快,更安全。

但是你也可以在一个循环中迭代多维数组的每个元素。这是一种更通用的方法。当您使用单个索引时,Matlab会对数组进行线性索引,无论其维数如何。

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