2017-09-07 2 views
1

튜플을 사용하는 containers.Map 개체 (예 : [4,1])를 키로 만들고 싶습니다. 그러나 이것은 유효한 키 유형이 아닙니다. 어떻게 이것을 유효한 키 유형으로 변환 할 수 있습니까?MATLAB containers. 튜플을 키로 매핑

궁극적 인 목표는 매트릭스처럼 인덱스 할 수 있지만 임의의 객체를 저장할 수있는 스파 스 셀 배열과 같은 것을 사용하는 것입니다.

+0

2D 셀 배열을 사용할 수 없습니까? – rahnema1

+0

그래,하지만 셀 배열의 전체 범위가 큰 경우 (각면에 수천 개) – KQS

+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 X 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'; 

단점은 단지 2 차원 배열을 허용한다는 것입니다 (sparse 만 2를 생산하기 때문에 -D 배열). 또한 이러한 솔루션 중 하나를 이와 같은 클래스로 래핑 할 수 있습니다.

+3

이 답변의 색조로 인해 혼란스럽고 여러분과 같이 읽습니다. 대체 계정에 로그인하는 것을 잊어 버렸습니다. – excaza

+0

덜 혼란스럽게 편집하려면 어떻게해야합니까? 또한, 자신의 질문에 대답하는 것은 나쁜 예의입니까? 나는 이것을하기 위해 다른 계정이 필요하다는 것을 몰랐다. – KQS

+0

[자기 답장은 명시 적으로 권장됩니다] (https://meta.stackexchange.com/help/self-answer). 이 대답의 주요 질문은 약간 이상하며 대체 계정에서 자신과 대화하려고하는 것처럼 들립니다. – excaza

관련 문제