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
,以便在索引时得到正确的结果。密切相关/可能重复:我提出的解决方案是创建一个2Da
,并使用元组键作为索引存储值,如a(4,1)=my_val
;可能不是最快的。这个答案的语气让我感到困惑,读起来好像你忘记登录你的备用帐户来发布答案。我如何编辑这个以减少困惑?另外,回答自己的问题是不是很不礼貌?我不知道我需要一个备用帐户来做这件事。。这个答案的主要问题有点奇怪,听起来像是你在试图从另一个帐户与自己交谈。