map1 = containers.Map({'212','2','12','44'},[4,5,6,7]);
keyset = str2double(keys(map1));
现在我对keyset进行一组操作,它们将返回
Keyset= [203,2,12,39];
我厌倦了以下事情:
num2cell(num2str(keyset));
num2cell(num2str(keyset,1));
num2cell(num2str(keyset,'%11.0g'));
num2cell(num2str(keyset,3));
以上所有结果都给出了最终细胞阵列的奇怪结果。我只需要将整数用作另一个容器映射的键。
答案 0 :(得分:13)
我提出了5个额外的解决方案,其中三个解决方案比目前提出的解决方案快4-5倍。从中吸取的教训是:
num2str
很慢cellfun
和arrayfun
会增加很多开销三种性能最高的解决方案在性能方面非常相似:
循环分配单元格元素
n4 = length(Keyset);
tmp4 = cell(n4,1);
for i4 = 1:n4
tmp4{i4} = sprintf('%i',Keyset(i4));
end
将all转换为字符串并调用textscan
tmp6 = textscan(sprintf('%i\n',Keyset'),'%s');
tmp6 = tmp6{1};
将all转换为字符串并调用regexp
。
tmp3 = regexp(sprintf('%i ',Keyset),'(\d+)','match');
以下是包含时间的完整测试代码:
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
答案 1 :(得分:7)
怎么样:
arrayfun(@num2str, Keyset, 'Uniform', false)'
应该为您的示例生成一个4乘1的单元格数组:
ans =
'203'
'2'
'12'
'39'
答案 2 :(得分:3)
怎么样:
eval( [ 'NewKeySetStr = { ', sprintf(' %d ', Keyset), ' }; '] );
NewKeySetStr
我不确定这是达到预期效果的最优雅方式,但似乎有效......
将运行时与Eitan的解决方案进行比较:
t=zeros(2,1);
for ii=1:100,
Keyset=randi(1,10,100); % random keys
tic;
eval( [ 'NewKeySetStr = { ', sprintf(' %d ', Keyset), ' }; '] );
t(1)=t(1)+toc;
tic;
tmp=arrayfun(@num2str, Keyset, 'Uniform', false);
t(2)=t(2)+toc;
end;
t
收率:
t =
0.3986
2.2527
似乎建议的解决方案更快。
注意:似乎cellfun
的当前实现未针对速度进行优化。有传言称,在未来的版本中,Mathworks打算引入更好的cellfun
实现。因此,Eitan的解决方案在当前版本中可能不是最佳的,但它似乎是Matlab技能的一个很好的实践。
答案 3 :(得分:0)
使用拆分功能找出如何改进大整数的正则表达式解决方案。 我也被Jonas的一个解决方案误解了,它没有评估for循环中的所有sprintf调用。 编辑:还添加了评论中建议的新2016字符串功能。
t = speedTest()
function t = speedTest
t=zeros(5,1);
for ii=1:100
Keyset=randi(10000000,10,1000); % random keys
tic;
n4 = numel(Keyset); % changed to numel (length only gives number of columns)
tmp1 = cell(n4,1);
for i4 = 1:n4
tmp1{i4} = sprintf('%i',Keyset(i4));
end
t(1) = t(1)+toc;
tic;
tmp2 = regexp(sprintf('%i ',Keyset),'(\d+)','match');
t(2) = t(2)+toc;
tic;
tmp3 = regexp(sprintf('%i ',Keyset),' ','split');
tmp3(end) = [];
t(3) = t(3)+toc;
tic;
tmp4 = string(Keyset(:));
t(4) = t(4)+toc;
# test in case you want to go back to characters
tic;
tmp5 = char(string(Keyset(:)));
t(5) = t(5)+toc;
end
end
具有拆分的正则表达式解决方案产生稍好的性能,字符串方法更快:
t =
6.1916
1.1292
0.8962
0.6671
0.7523