다음과 같이 정의 된지도가 있습니다.
diagonal = eye(4);
v = {diagonal(1,:), diagonal(2,:), diagonal(3,:), diagonal(4,:)}
k = {1, 3, 7, 8}
class_labels = containers.Map(k, v)
이제 리버스 맵이 필요하지만 Matlab은 키가 배열이되는 것을 허용하지 않으므로 각 배열을 문자열로 변환해야합니다.
그래서 내 class_labels 맵은 다음과 같습니다.
1 => [0 0 0 1]
3 => [0 0 1 0]
7 => [0 1 0 0]
8 => [1 0 0 0]
다음과 같은 것이 필요합니다.
0001 => 1
0010 => 3
0100 => 7
1000 => 8
당신은 사용할 수 있습니다 keys
및 values
과 관련된 방법 containers.Map
키와 값을 추출하는 클래스를 다음 단순히 다른 구성 .... 함께 비트를 모두 연결하여 값에 문자열 변환을 적용합니다 containers.Map
. 당신이 할 것입니다 것은 사용하는 것입니다 cellfun
값 셀 어레이의 각 셀 요소를 통해 반복하고 연결된 문자열로 배열의 숫자의 순서를 변환하도록 기능을 적용 할 수 있습니다.
당신이 이미 정의한 키와 값에 접근 할 수 없다고 가정하고 우리는 containers.Map
그 자체 에만 접근 할 수 있다고 가정 해 봅시다 . 사전을 반전 시키려면 다음과 같이하십시오.
%// Your code
diagonal = eye(4);
v = {diagonal(1,:), diagonal(2,:), diagonal(3,:), diagonal(4,:)};
k = {1, 3, 7, 8};
class_labels = containers.Map(k, v);
%// New - Get the keys and labels
kr = keys(class_labels);
vr = values(class_labels);
%// Concatenate all of the bits of the values into a string
vr = cellfun(@(x) char(48+x), vr, 'uni', 0);
%// Create new dictionary
new_labels = containers.Map(vr, kr);
여기에있는이 줄은 아마도 가장 혼란 스러울 것입니다 : vr = cellfun(@(x) char(48+x), vr, 'uni', 0);
. cellfun
셀형 배열의 모든 셀을 반복하고 각 셀에 함수를 적용합니다. 이 함수는에 대한 첫 번째 입력 cellfun
입니다. 셀 배열의 셀 내용을받는 익명 함수를 선언했습니다. 그래서 이것은 값의 배열이되고 각 숫자에 48을 더합니다. 이것은 우리에게 48/49
대신 0/1
. 이 작업을 수행 char
하면 숫자가 ASCII 또는 해당 문자열로 표시되도록 이 배열을로 캐스팅합니다 . 의 ASCII 코드는 0/1
입니다 48/49
. 사용하여char
이 수정 된 배열에서 생성되는 것은 이러한 모든 문자를 함께 연결하는 문자열입니다. 두 번째 입력은 우리가 작업중인 셀형 배열이고, 세 번째와 네 번째 매개 변수는의 출력이 cellfun
숫자 형 벡터가 아니라 값으로 구성된 또 다른 셀형 배열 임을 알려 줍니다. 'uni'
는 'UniformOutput
'의 약자이며이 0/false
함수의 출력이 숫자 형 벡터가 아니라 벡터로 구성된 셀형 배열이기 때문에 로 설정됩니다 . 각 셀은 숫자 형 배열의 모든 숫자를 함께 연결하여 생성 된 문자열입니다.
키와 값을 표시하면 다음을 얻습니다.
>> keys(new_labels)
ans =
'0001' '0010' '0100' '1000'
>> values(new_labels)
ans =
[8] [7] [3] [1]
각 문자열 키가 오른쪽 역값에 매핑되는 것을 볼 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다