Matlab:将双向量数组转换为字符串单元格数组

mar*_*tin 8 arrays string double matlab cell

map1 = containers.Map({'212','2','12','44'},[4,5,6,7]);
keyset = str2double(keys(map1));
Run Code Online (Sandbox Code Playgroud)

现在我对keyset进行一组操作,这些操作将返回

Keyset= [203,2,12,39];
Run Code Online (Sandbox Code Playgroud)

我厌倦了以下几点:

num2cell(num2str(keyset));
num2cell(num2str(keyset,1));
num2cell(num2str(keyset,'%11.0g'));
num2cell(num2str(keyset,3));
Run Code Online (Sandbox Code Playgroud)

以上所有结果都给出了最终细胞阵列的奇怪结果.我只需要将整数用作另一个容器映射的键.

Jon*_*nas 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
Run Code Online (Sandbox Code Playgroud)

将all转换为字符串并调用 textscan

tmp6 = textscan(sprintf('%i\n',Keyset'),'%s');
tmp6 = tmp6{1};
Run Code Online (Sandbox Code Playgroud)

将all转换为字符串并调用regexp.

tmp3 = regexp(sprintf('%i ',Keyset),'(\d+)','match');
Run Code Online (Sandbox Code Playgroud)

这是带有时序的完整测试代码:

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
Run Code Online (Sandbox Code Playgroud)


Eit*_*n T 7

怎么样:

arrayfun(@num2str, Keyset, 'Uniform', false)'
Run Code Online (Sandbox Code Playgroud)

这应该为您的示例产生一个4乘1的单元格数组:

ans = 
    '203'
    '2'
    '12'
    '39'
Run Code Online (Sandbox Code Playgroud)