2

我的问题:我有一个 char 类型的数组A,如下所示:

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 循环

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

4 回答 4

4

如果将矩阵转换为列向量,每个字符将位于不同的行中,因此可以由str2num. 然后reshape回来:

result = reshape(str2num(A(:)), size(A))
于 2013-03-13T16:13:18.397 回答
0

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

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))
于 2013-03-13T16:12:34.037 回答
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更安全str2numeval

但是您也可以在一个循环中遍历多维数组的每个元素。这是一种更通用的方法。当您使用单个索引时,Matlab 会线性索引到数组中,而不管其维度如何。

result = NaN(size(s));
for i = 1:numel(s)
    result(i) = str2double(s(i));
end
于 2013-03-18T03:42:40.563 回答
0

矩阵result1是您想要的。

在此处输入图像描述

于 2013-03-13T17:46:04.997 回答