Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MATLAB容器。以元组为键的映射_Matlab_Dictionary - Fatal编程技术网

MATLAB容器。以元组为键的映射

MATLAB容器。以元组为键的映射,matlab,dictionary,Matlab,Dictionary,我想创建一个containers.Map对象,它使用元组作为键,例如[4,1]。但是,这不是有效的密钥类型。如何将其转换为有效的密钥类型 我的最终目标是拥有一个像稀疏单元数组这样的东西,我可以像矩阵一样索引,但可以存储任意对象。我收到了很多作为注释的答案,所以为了子孙后代(以及我自己的理智),我将这些作为实际的答案来写 通过sub2ind 如果试图模拟具有已知大小的稀疏矩阵的行为,则可以使用sub2ind将任何有效元组转换为唯一的线性索引 例如,如果假设稀疏单元阵列的大小为1000 x 200,

我想创建一个
containers.Map
对象,它使用元组作为键,例如
[4,1]
。但是,这不是有效的密钥类型。如何将其转换为有效的密钥类型


我的最终目标是拥有一个像稀疏单元数组这样的东西,我可以像矩阵一样索引,但可以存储任意对象。

我收到了很多作为注释的答案,所以为了子孙后代(以及我自己的理智),我将这些作为实际的答案来写

通过
sub2ind
如果试图模拟具有已知大小的稀疏矩阵的行为,则可以使用
sub2ind
将任何有效元组转换为唯一的线性索引

例如,如果假设稀疏单元阵列的大小为1000 x 200,则可以执行以下操作:

sp_cell = containers.Map('KeyType','double', 'ValueType','any');
key_converter = @(i,j) sub2ind([1000,200], i,j);
sp_cell(key_converter(4,1)) = 'foo';
元组到字符串通过
mat2str
或者(更一般地说),您可以使用
mat2str
将元组转换为字符串,但这样您将无法检查
sub2ind
提供的数组索引边界:

sp_cell = containers.Map('KeyType','char', 'ValueType','any');
key_converter = @(tup) mat2str(tup);
sp_cell(key_converter([4 1])) = 'bar'
元组作为unicode字符串 From:如果每个索引小于或等于65535,则可以直接将元组转换为字符串

key_converter = @(tup) char(tup);
散列 From:可以将元组散列为字符串

md = java.security.MessageDigest.getInstance('MD5');
key_converter = @(tup) char(md.digest(tup));
这里的缺点是无法将映射键转换回元组

稀疏查找表 来自@SamRobert的评论:您可以将索引的稀疏数组创建为一维单元格数组。下面是一个快速而肮脏的类模型:

classdef SparseCellArray
    properties (Access=protected)
        lookup
        contents
    end
    methods
        function self = SparseCellArray(m,n)
            % Constructor; takes array dimensions as [#rows, #cols]
            self.lookup = sparse(m,n);
            self.contents = {};
        end
        function B = subsref(self, S)
            % Overload matrix-style indexing
            assert(isscalar(S) && strcmp(S.type,'()'));
            idx = self.lookup(S.subs{1}, S.subs{2});
            assert(idx ~= 0, 'Index not found');
            B = self.contents{idx};
        end
        function newobj = subsasgn(self, S, B)
            % Overload matrix-style indexing 
            assert(isscalar(S) && strcmp(S.type,'()'));
            idx = self.lookup(S.subs{1}, S.subs{2});
            newobj = self;
            if (idx == 0)
                idx = length(self.contents) + 1;
                newobj.lookup(S.subs{1}, S.subs{2}) = idx;
            end
            newobj.contents{idx} = B;
        end
    end
end
用法如下:

sp_cell = SparseCellArray(2000,100);
sp_cell(4,1) = 'foo';

缺点是它只接受二维数组(因为
sparse
只生成二维数组)。另外请注意,这些解决方案中的任何一个都可以封装在这样的类中。

难道不能使用2D单元数组吗?是的,但我担心的是,如果单元数组的总范围很大(每侧上千个),那么内存的使用情况。如果您想要一个行为类似稀疏单元数组的类,请实现一个行为类似稀疏单元数组的类,不要滥用
容器。映射
。例如,一个类包含一个稀疏的索引数组作为一个属性,一个单元格数组作为另一个属性,然后在类上重载
subsref
,以便在索引时得到正确的结果。密切相关/可能重复:我提出的解决方案是创建一个2D
a
,并使用元组键作为索引存储值,如
a(4,1)=my_val
;可能不是最快的。这个答案的语气让我感到困惑,读起来好像你忘记登录你的备用帐户来发布答案。我如何编辑这个以减少困惑?另外,回答自己的问题是不是很不礼貌?我不知道我需要一个备用帐户来做这件事。。这个答案的主要问题有点奇怪,听起来像是你在试图从另一个帐户与自己交谈。