我的问题:我有一个类型为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
但这只是返回数组的最后一行,我希望拥有所有这些。
答案 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 就是你想要的。
答案 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
在幕后调用str2num
,str2num
通常比eval
更快,更安全。
但是你也可以在一个循环中迭代多维数组的每个元素。这是一种更通用的方法。当您使用单个索引时,Matlab会对数组进行线性索引,无论其维数如何。
result = NaN(size(s));
for i = 1:numel(s)
result(i) = str2double(s(i));
end