容器映射和matlab中的结构之间的区别

时间:2016-01-13 12:40:54

标签: matlab dictionary

我想了解容器贴图和matlab中的结构之间的区别。

从我看来,似乎容器映射的优点是它可以使用任何数字或字符串作为键,而struct字段只能接受作为合法变量名称的字符串(例如它不接受mystruct.('123string')

在结构上使用容器映射还有其他优点吗?

由于

2 个答案:

答案 0 :(得分:8)

容器映射和结构背后的概念完全不同:

容器映射用于创建映射或索引。例如,如果您有一个矩阵A并希望索引第二行和第二列中的元素,则将使用A(2,2)对其进行索引。对于数字,矩阵等,您希望索引特定行号,这很方便。但是,假设您的情况如下例Mathworks所示:

example

这里有一组值,您可以在1月份将其编入value(1),依此类推。然而,这不是很清晰。如果你可以用value('Jan')索引它会更方便。这正是容器地图提供的内容。正如@marsei在评论中所说,容器映射是一种基于Java的无序构造,它使用散列表进行索引。

结构是一个不同的结构,它是基于C的并且是有序的(感谢没有的@marsei)。 struct的主要用途是帮助您以更合理的方式存储数据。例如,使用图像时,通常有两个变量:一个用于图像数据,另一个用于颜色图。如果没有结构,则需要在工作区中保留这两个单独的变量。对于多个图像,这会非常混乱(例如使用img0_dataimg0_map之类的名称等等。结构可以帮助您以一种简单的方式组织它:一个名为img0的结构,其中包含字段datamap

在字典的上下文中,两种结构或多或少都是等价的,尽管结构通常看起来比容器映射更快。另外,正如问题中已经提到的,容器映射的key可以是任何单个值,而对于结构,它必须是字符串。

答案 1 :(得分:2)

在阅读了@ hbaderts的回答之后,它让我想知道速度差实际是什么。因此,我继续尝试了一些基准测试。

%%  Below is to test read/write speed of struct, hashMap, and hashMap matrix assignment
numTrials= 10;
numKeys= 10000;
hw= zeros(1,numTrials);
hr= zeros(1,numTrials);
hmw= zeros(1,numTrials);
hmr= zeros(1,numTrials);
sw= zeros(1,numTrials);
sr= zeros(1,numTrials);
str= cell(1,numTrials);

for z= 1:numTrials

    for e=1:numKeys
        str{e}= strcat('adc',num2str(e)); 
    end

    % HashMap write
    tic;
    m= containers.Map(); 
    for a=1:numKeys
        m(str{a})=str{a}; 
    end 
    hw(z)= toc;

    % HashMap read
    tic;
    for b=1:numKeys
        m(str{b});
    end
    hr(z)= toc;

    % HashMap matrix write
    tic;
    keyval= cell(numKeys,1);
    for a=1:numKeys
        keyval{a}=str{a};
    end
    mm= containers.Map(keyval,keyval);
    hmw(z)= toc;

    % HashMap matrix read
    tic;
    for b=1:numKeys
        mm(str{b});
    end
    hmr(z)= toc;

    % Struct write
    tic;
    s= struct();
    for c=1:numKeys
        s.c.s.x.(str{c})= str{c}; 
    end 
    sw(z)= toc;

    % Struct read
    tic;
    for d=1:numKeys
        s.c.s.x.(str{d}); 
    end
    sr(z)= toc;

end

fprintf('hashmap read time\n avg: %.3f seconds\n max: %.3f seconds\n',sum(hr)/numTrials,max(hr));
fprintf('hashmap write time\n avg: %.3f seconds\n max: %.3f seconds\n',sum(hw)/numTrials,max(hw));
fprintf('hashmap matrix read time\n avg: %.3f seconds\n max: %.3f seconds\n',sum(hmr)/numTrials,max(hmr));
fprintf('hashmap matrix write time\n avg: %.3f seconds\n max: %.3f seconds\n',sum(hmw)/numTrials,max(hmw));
fprintf('struct read time\n avg: %.3f seconds\n max: %.3f seconds\n',sum(sr)/numTrials,max(sr));
fprintf('struct write time\n avg: %.3f seconds\n max: %.3f seconds\n',sum(sw)/numTrials,max(sw));

结果:

hashmap read time

平均值:0.301秒。

最大:0.320秒。

hashmap write time

平均值:0.233秒。

最大:0.247秒。

hashmap matrix read time

平均值:0.305秒。

最大:0.323秒。

hashmap matrix write time

平均值:0.011秒。

最大:0.016秒。

struct read time

平均值:0.059秒。

最大值:0.066秒。

struct write time

平均值:0.040秒。

最大值:0.046秒。

如果此测试看起来有效,请告诉我!