Arrays MATLAB-将数字字符数组转换为数字整数数组/矩阵?
我的问题:我有一个char类型的数组,如下所示: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),但将字符视为每行一个整
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
请不要将代码作为截图发布,简单的剪切粘贴即可。请不要将代码作为截图发布,简单的剪切粘贴即可。