2010-06-01 9 views
2

현재 각 관측치에 대해 4 개의 값을 포함하는 관측치 집합에 대해 일련의 퍼지 규칙을 자동으로 생성하려고합니다. 상태 (Fisher 's Iris Data의 좋은 예입니다)에 해당합니다.Matlab에서 4 차원 규칙 표 단순화 : 각 차원의 행과 열을 주소 지정

Matlab에서 하나의 셀 (a, b, c, d)에 해당 상태가 포함될 4 차원 규칙 테이블을 생성 중입니다. 테이블을 줄이려면 Hong and Lee 행 및 열 유사성 검사 방법을 따르고 있지만 세 번째 및 네 번째 차원의 행과 열을 처리하는 방법을 이해하는 데 어려움을 겪고 있습니다. 이 방법을 통해 각 차원이 개별적으로 처리된다는 사실을 이해할 수 있으며 규칙이 true이면 표가 단순화됩니다.

  1. 인접한 열이나 행의 모든 ​​셀이 같은 경우 다음과 같이 병합에 대한 규칙입니다.
  2. 두 개의 셀이 같거나 인접한 셀 중 하나가 공백 인 경우
    열 또는 행 중 하나 이상이 모두 인 셀이 비어 있지 않습니다.
  3. 열 또는 행의 모든 ​​셀이 비어 있고 두 열의 셀이 인접한 열 또는 행이 동일한 경우 은 세 개를 병합합니다. 열 또는 행의 모든 ​​셀들이 비어있는 그 두
    인접한 행 또는 열에서 셀들이 있다면 이들 중 동일 또는 하나가 비어 있으면
  4. 세 병합.
  5. 열 또는 행의 모든 ​​셀이 비어있는 경우 및 열의 모든 비어
    세포 또는 왼쪽 가 동일한 영역 및 열 또는 행의 모든 ​​ 비어 있지 않은 셀이 그것으로 행한다면 의 오른쪽에는 동일한 영역 인 이 있지만 이전에 설명한 영역과 다른 하나는 열을 두 부분으로 병합합니다.

혼란스러운 비트가 있습니다. 전체 행/열이 인접 항목 (규칙 1)과 동일한 지 확인하기 만하면됩니다.

if (a,:,:,:) == (a+1,:,:,:) 
    (:,b,:,:) == (:,b+1,:,:) 
    (:,:,c,:) == (:,:,c+1,:) 
    (:,:,:,d) == (:,:,:,d+1) 

이 정확히 맞습니까?

하지만 행/열의 요소가 일치하는지 또는 둘 중 하나가 0 (규칙 2와 4)인지 확인하려면 약간 손실됩니다. 내가 지금의 생각에 의해 혼동 해요로

for c = 1:20 
    for i = 1:length(a) 
     if (i,:,c,:) == (i,:,c+1,:) 
     ... 
     else if (i,:,c+1,:) == 0 
     ... 
     else if (i,:,c,:) == 0  etc. 

for d = 1:20 
    for i = 1:length(a) 
     if (i,:,:,d) == (i,:,:,d+1) 
     ... 
     else if (i,:,:,d+1) == 0 
     ... 
     else if (i,:,:,d) == 0  etc. 

도 네 차원 배열에 어떤 도움이 도움이 될 것입니다 :

for a = 1:20 
    for i = 1:length(b) 
     if (a+1,i,:,:) == (a,i,:,:) 
     ... 
     else if (a+1,i,:,:) == 0 
     ... 
     else if (a,i,:,:) == 0  etc. 

와 세 번째와 네 번째 치수 :이 라인을 따라 뭔가 될 것 세 개 이상! 내 의미를 이해하기 위해 종이를 보라고 조언합니다. 그들은 아이리스 데이터를 사용했지만 2D 테이블이있는 예제 만 제공했습니다.

+0

은 == 0과 동일합니까? Matlab에서 그들은 다르다 – Marc

+0

"비어있는"의미는 규칙 테이블의 해당 위치에있는 셀에 상태 값이 포함되어 있지 않으므로이 경우 빈 == 0입니다. – Cate

답변

1

내가 묻는 질문이 맞는지 확실하지 않지만 두 행의 값이 서로 같거나 같지 않거나 적어도 하나 이상 있는지 확인하는 방법은 다음과 같습니다. 0

table(a,:,:,:) == table(a+1,:,:,:) | table(a,:,:,:) == 0 | table(a+1,:,:,:) = 0; 

당신이 정말로 똑똑하지만, 다소 비밀로하려는 경우, 첫 번째 차원

(diff(table, [], 2) == 0) | table(:,1:(end-1),:,:) == 0 | table(:,2:end, :,:) == 0 
에 대한

(diff(table, [], 1) == 0) | table(1:(end-1),:,:,:) == 0 | table(2:end, :,:,:) == 0 

두 번째 등등

+0

이는 다소 이해하기 어렵지만 모양으로 보입니다 이 일에 도움이 될 수 있습니다. 더 나은 (그리고 더 간단한) 질문은 첫 번째 요소가 (a, 1, :, :)이고 두 번째 요소 (1, b)가 주어진다면 세 번째 및 네 번째 차원의 첫 번째 요소에 어떻게 액세스 할 것인가입니다. , : :) 등? – Cate

+0

사실, 전체 행/열이 전체적으로 "비어 있음"을 확인합니다. 그렇지 않습니까? 내 문제는 인접한 행/열의 개별 셀을 검사하여 일치하는지 또는 비어 있는지 확인하는 것입니다. 전체 행/열 셀 중 하나가 일치하거나 적어도 하나가 비어 있으면 두 행/열을 병합 할 수 있습니다. – Cate

+0

== 요소를 비교하여 요소를 수행하므로 [1 2 3 4 5] == [5 0 3 0 1] 당신이 무엇을 요구하는지 잘 모르겠습니다. 첫 번째 의견. 처음 3 개의 인덱스 == i, j, k, arr (i, j, k, :)가있는 모든 요소를 ​​얻기 위해 4 차원 배열의 개별 요소에 액세스하려면 arr (i, j, k, m) . – Marc