のようなタプルをキーとするcontainers.Map
オブジェクトを作成したいと思います。ただし、これは有効なキータイプではありません。これを有効なキータイプに変換するにはどうすればよいですか?MATLABコンテナ。タプルをキーとしてマップする
私の究極の目標は、マトリックスのようにインデックスを付けることはできますが、任意のオブジェクトを格納できる疎なセル配列のようなものを持つことです。
のようなタプルをキーとするcontainers.Map
オブジェクトを作成したいと思います。ただし、これは有効なキータイプではありません。これを有効なキータイプに変換するにはどうすればよいですか?MATLABコンテナ。タプルをキーとしてマップする
私の究極の目標は、マトリックスのようにインデックスを付けることはできますが、任意のオブジェクトを格納できる疎なセル配列のようなものを持つことです。
私はコメントとして多くの回答を受けました。したがって、私は後世(そして自分の正気)のためにこれらを実際の回答として書いています。あなたが知られているサイズの疎行列の動作をエミュレートしようとしている場合、あなたはsub2ind
を使用して独自の線形インデックスに任意の有効なタプルを変換することができますsub2ind
経由スカラへの
mat2str
を経由して文字列に
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
を使用することができますが、あなたは配列インデックスのチェックがsub2ind
が提供する境界失う:
sp_cell = containers.Map('KeyType','char', 'ValueType','any');
key_converter = @(tup) mat2str(tup);
sp_cell(key_converter([4 1])) = 'bar'
this answer:各インデックスが65535以下の場合は、タプルを直接文字列に変換できます。
key_converter = @(tup) char(tup);
をハッシュ:あなたは、文字列の中にタプルをハッシュすることができます。
md = java.security.MessageDigest.getInstance('MD5');
key_converter = @(tup) char(md.digest(tup));
ここでの欠点は、マップキーをタプルに戻すことができないことです。 @ SamRobertさんのコメントから
:あなたは1-Dセル配列にインデックスのまばらな配列を作成することができます。
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
のみ2を生成するので、それだけで(2-D配列を受け入れることです-D配列)。また、これらのソリューションは、このようなクラスでラップすることができます。
2Dセル配列を使用できませんか? – rahnema1
はい、セル配列の合計範囲が大きい場合はメモリ使用量が心配です(両側に数千) – KQS
スパースセル配列のように動作するものを使用する場合は、スパースセル配列のように動作するクラスを実装してください'容器。マップ 'を乱用しないでください。例えば、インデックスのスパース配列を1つのプロパティとして、クラスのセル配列を別のものにしてクラスに 'subsref'をオーバーロードすることで、インデックスを作成するときに正しいものを得ることができます。 –