2017-09-07 6 views
1

のようなタプルをキーとするcontainers.Mapオブジェクトを作成したいと思います。ただし、これは有効なキータイプではありません。これを有効なキータイプに変換するにはどうすればよいですか?MATLABコンテナ。タプルをキーとしてマップする

私の究極の目標は、マトリックスのようにインデックスを付けることはできますが、任意のオブジェクトを格納できる疎なセル配列のようなものを持つことです。

+0

2Dセル配列を使用できませんか? – rahnema1

+0

はい、セル配列の合計範囲が大きい場合はメモリ使用量が心配です(両側に数千) – KQS

+1

スパースセル配列のように動作するものを使用する場合は、スパースセル配列のように動作するクラスを実装してください'容器。マップ 'を乱用しないでください。例えば、インデックスのスパース配列を1つのプロパティとして、クラスのセル配列を別のものにしてクラスに 'subsref'をオーバーロードすることで、インデックスを作成するときに正しいものを得ることができます。 –

答えて

0

私はコメントとして多くの回答を受けました。したがって、私は後世(そして自分の正気)のためにこれらを実際の回答として書いています。あなたが知られているサイズの疎行列の動作をエミュレートしようとしている場合、あなたは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'; 

タプルを:あなたの仮定のスパースセル配列のサイズは1000×200であることがある場合

はたとえば、あなたが行うことができますあなたは、文字列の中にあなたのタプルを変換する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); 

this answerから

をハッシュ:あなたは、文字列の中にタプルをハッシュすることができます。

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配列)。また、これらのソリューションは、このようなクラスでラップすることができます。

+3

この回答のトーンは私を混乱させ、代替アカウントにログインして回答を投稿するのを忘れた – excaza

+0

これをあまり混乱させないように編集するにはどうすればよいですか?また、あなた自身の質問に答えるのは悪いエチケットですか?私はこれを行うために別のアカウントが必要であることを知らなかった。 – KQS

+0

[自己回答は明示的に推奨されています](https://meta.stackexchange.com/help/self-answer)。この回答の主な質問はちょっと変わって、別のアカウントから自分と話そうとしているように聞こえます。 – excaza

関連する問題