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

Arrays MATLAB-将数字字符数组转换为数字整数数组/矩阵?,arrays,matlab,char,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),但将字符视为每行一个整

我的问题:我有一个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

但这只是返回数组的最后一行,我想要全部。我不知道为什么要转换两次。只需遍历两个索引,转换每个字符并将其放入新的矩阵中

for i = 1:size(A,1)
    for t = 1:size(A,2)
        result(i,t) = str2num(A(i,t));
    end
end
PS:在循环之前预先分配
结果
将提高速度:

result = zeros(size(A))

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

for i = 1:size(A,1)
    for t = 1:size(A,2)
        result(i,t) = str2num(A(i,t));
    end
end
PS:在循环之前预先分配
结果
将提高速度:

result = zeros(size(A))

如果将矩阵转换为列向量,则每个字符将定位在不同的行中,以便可以由
str2num
独立处理。然后
重塑
背面:

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

如果将矩阵转换为列向量,则每个字符将定位在不同的行中,以便可以由
str2num
独立处理。然后
重塑
背面:

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

矩阵结果1就是您想要的


矩阵结果1就是您想要的


艾坦特的答案可能是最好的。它更干净,可能更快。但也有一些相关的索引问题需要指出

如果您知道输入字符都是数字,可以使用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

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

请不要将代码作为截图发布,简单的剪切粘贴即可。请不要将代码作为截图发布,简单的剪切粘贴即可。