튜플을 사용하는 containers.Map
개체 (예 : [4,1]
)를 키로 만들고 싶습니다. 그러나 이것은 유효한 키 유형이 아닙니다. 어떻게 이것을 유효한 키 유형으로 변환 할 수 있습니까?MATLAB containers. 튜플을 키로 매핑
궁극적 인 목표는 매트릭스처럼 인덱스 할 수 있지만 임의의 객체를 저장할 수있는 스파 스 셀 배열과 같은 것을 사용하는 것입니다.
튜플을 사용하는 containers.Map
개체 (예 : [4,1]
)를 키로 만들고 싶습니다. 그러나 이것은 유효한 키 유형이 아닙니다. 어떻게 이것을 유효한 키 유형으로 변환 할 수 있습니까?MATLAB containers. 튜플을 키로 매핑
궁극적 인 목표는 매트릭스처럼 인덱스 할 수 있지만 임의의 객체를 저장할 수있는 스파 스 셀 배열과 같은 것을 사용하는 것입니다.
나는 많은 답변을 코멘트로 받았다. 그래서 후손을 위해 (그리고 내 자신의 온건함) 나는 실제 답변으로 이것을 쓰고있다. 당신이 알고있는 크기의 희소 행렬의 행동을 모방하려는 경우
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';
단점은 단지 2 차원 배열을 허용한다는 것입니다 (sparse
만 2를 생산하기 때문에 -D 배열). 또한 이러한 솔루션 중 하나를 이와 같은 클래스로 래핑 할 수 있습니다.
이 답변의 색조로 인해 혼란스럽고 여러분과 같이 읽습니다. 대체 계정에 로그인하는 것을 잊어 버렸습니다. – excaza
덜 혼란스럽게 편집하려면 어떻게해야합니까? 또한, 자신의 질문에 대답하는 것은 나쁜 예의입니까? 나는 이것을하기 위해 다른 계정이 필요하다는 것을 몰랐다. – KQS
[자기 답장은 명시 적으로 권장됩니다] (https://meta.stackexchange.com/help/self-answer). 이 대답의 주요 질문은 약간 이상하며 대체 계정에서 자신과 대화하려고하는 것처럼 들립니다. – excaza
2D 셀 배열을 사용할 수 없습니까? – rahnema1
그래,하지만 셀 배열의 전체 범위가 큰 경우 (각면에 수천 개) – KQS
희박한 셀 배열처럼 동작하는 무언가를 원한다면 스파 스 셀 배열처럼 동작하는 클래스를 구현하십시오 , 용기를 남용하지 마세요. 맵.예를 들어, 하나의 속성으로 색인의 희소 배열을 포함하는 클래스를 가지며, 다른 것으로 셀 배열을 배열 한 다음 클래스에'subsref'를 오버로드하여 색인을 생성 할 때 올바른 것을 얻을 수 있도록하십시오. –