将数字数组转换为字符串单元格数组

3

给定矩阵:A = [0 1 2 3 4 5];

我想将其转换为字符串单元数组,如下所示:A = {'0' '1' '2' '3' '4' '5'};

我可以使用以下方法完成此操作:

A = [0 1 2 3 4 5];

for i=1:6
    A1{i}= num2str(A(i));
end
A1

我希望以更简单、不需要循环的方式完成此操作。

3个回答

5

使用 num2strstrsplit 的另一种单行方法:

A1 = strsplit(num2str(A))

+1 很棒,也很快的解决方案,但是基于兼容性和速度考虑,我建议使用 regexp A1 = regexp(num2str(A), '\s+', 'split'); 在我的测试中,regexpstrsplit 快七倍。 - serial

3

您可以将arrayfun匿名函数结合使用:

B = arrayfun(@(x) {num2str(x)}, A);

cellfun 是一个更快的方法,同样也能正常工作:

B = cellfun(@num2str, num2cell(A), 'uni', 0);

最快速的解决方案是这个解决方案的改进版本(由obchardon提供)。

B = regexp(num2str(A), '\s+', 'split');

1
arrayfun只是一个循环的包装器,所以基本上和OP完全一样。 - Dan
@Dan 不完全是这样。实际上,这将为每个单元格提供一个数字,而 OP 将创建一个字符串,其中每个单元格都有一个字符。我认为这更接近问题的实质,因为这是唯一产生等效代码的答案。 - patrik
1
@Patrik,我没有看到这个和原始循环之间的区别,即使对于多位数字也是如此... - Dan
1
我同意@Dan的观点,对我来说没有“计算”上的差异,这个方法仍然很慢。 - obchardon

0
下面的解决方案大致按照速度从快到慢排序。请注意,这些解决方案分为三类数量级性能。
这是在iMac上使用来自MacPorts的预编译Octave 4.2.2;octave @4.2.2_1+accelerate+app+docs+fltk+gfortran+graphicsmagick+qt5+sound
Elapsed time is 0.00452113 seconds.
Elapsed time is 0.0121579 seconds.
Elapsed time is 0.0185781 seconds.
Elapsed time is 0.0243361 seconds.
Elapsed time is 0.025944 seconds.
Elapsed time is 2.42572 seconds.
Elapsed time is 2.4809 seconds.
Elapsed time is 2.48733 seconds.
Elapsed time is 2.49299 seconds.

重点:首选sprintf而不是其他任何to-string转换,以及ostrsplit而不是strsplit
clear all
A=rand(1,2000);
#A=1:2000;

tic
A4=ostrsplit(sprintf("%g ",A), " ", true);
toc;tic

A9=ostrsplit(num2str(A), " ", true);
toc;tic

A8=regexp(num2str(A), '\s+', 'split');
toc;tic

A3S=num2str(A');
A3=mat2cell(A3S,ones(1,size(A3S,1)))';
A3=strtrim(A3);
toc;tic

A5=strsplit(num2str(A));
toc;tic

A7=cellfun(@num2str, num2cell(A), 'uni', 0);
toc;tic

A6=arrayfun(@(x) {num2str(x)}, A);
toc;tic

A2=cell(size(A));
for i = 1:numel(A)
  A2{i} = num2str(A(i));
endfor
toc;tic

for i = 1:numel(A)
  A1{i} = num2str(A(i));
endfor
toc;tic

这个问题没有标记Octave。因此,一些解决方案是不相关的,另一些已经发布了。只有其中一个是新的。最好承认你在自己的解决方案中包含的已发布解决方案。'不是转置。 - Sardar Usama

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接