Ich schlage vor, 5 zusätzliche Lösungen, von denen drei 4-5x schneller um als die bisher vorgeschlagenen Lösungen. Die Lehren daraus gelernt sind:
num2str
langsam
cellfun
und arrayfun
erheblichen Aufwand hinzufügen können
- Es gibt viele Möglichkeiten, um ein numerisches Array an eine Zelle Array von Strings zu konvertieren.
Die drei leistungsstärksten Lösungen sind sehr ähnlich in Bezug auf Leistung:
Looping Zellelemente
n4 = length(Keyset);
tmp4 = cell(n4,1);
for i4 = 1:n4
tmp4{i4} = sprintf('%i',Keyset(i4));
end
Konvertieren alle Streich- und ruft textscan
tmp6 = textscan(sprintf('%i\n',Keyset'),'%s');
tmp6 = tmp6{1};
zuweisen Konvertiert alle in eine Zeichenfolge und ruft regexp
auf.
tmp3 = regexp(sprintf('%i ',Keyset),'(\d+)','match');
Hier ist der vollständige Testcode mit Timings:
function t = speedTest
t=zeros(7,1);
for ii=1:100,
Keyset=randi(1,10,100); % random keys
tic;
eval([ 'tmp1 = { ', sprintf(' %d ', Keyset), ' }; ']);
t(1)=t(1)+toc;
tic;
tmp2=arrayfun(@num2str, Keyset, 'Uniform', false);
t(2)=t(2)+toc;
tic;
tmp3 = regexp(sprintf('%i ',Keyset),'(\d+)','match');
t(3) = t(3)+toc;
tic;
n4 = length(Keyset);
tmp4 = cell(n4,1);
for i4 = 1:n4
tmp4{i4} = sprintf('%i',Keyset(i4));
end
t(4) = t(4)+toc;
tic;
n5 = length(Keyset);
tmp5 = cell(n5,1);
for i5 = 1:n5
tmp4{i5} = num2str(Keyset(i5));
end
t(5) = t(5)+toc;
tic;
tmp6 = textscan(sprintf('%i\n',Keyset'),'%s');
tmp6 = tmp6{1};
t(6) = t(6)+toc;
tic;
tmp7 = num2cell(Keyset);
tmp7 = cellfun(@(x)sprintf('%i',x),tmp7,'uni',false);
t(7) = t(7)+toc;
end;
t
t =
1.7820
21.7201
0.4068
0.3188
2.2695
0.3488
5.9186
Also, was ist das gewünschte Ergebnis? Ist es {203}, 2, 12, 39}? –