2012-12-02 3 views
0

우리가 매트릭스 result 다음matlab에 : 그룹화와 매트릭스의 독특한 열 요소의 인덱스를 최소화

이 이

그것의 열 고유 한 요소의 인덱스 크기는 (제로없이)입니다

result = 
    Columns 1 through 13 
    3  1  1  1  1  1  6  2  3  6  2  1  6 
    4  3  3  5  7  5 10 10  4 10  6  9  8 
    6  4  4  7  9  7  0  0  0  0  0  0  0 
    10  5  5  8  0  0  0  0  0  0  0  0  0 
    Columns 14 through 25 
    2 10  3 10  3  8  8  0  0  0  0  0 
    8  0  0  0  0  0  0  0  0  0  0  0 
    0  0  0  0  0  0  0  0  0  0  0  0 
    0  0  0  0  0  0  0  0  0  0  0  0 
:

Indexes of result: 
    Columns 1 through 13 
    4  4  4  4  3  3  2  2  2  2  2  2  2 
    Columns 14 through 25 
    2  1  1  1  1  1  1 

내가 원하는 다음 시나리오를 수행하십시오. 첫 번째 열에서 시작하여 고유하지 않은 각 값을 우리 행렬에 한 번만 표시하도록 제한하려고합니다. 우리가 col4가 가장 독특한 요소가 참조로 이제

result = 
    Columns 1 through 13 
    3  1  1  1  1  1  0  2  0  0  2  1  0 
    4  0  0  5  7  5  0  0  0  0  0  9  8 
    6  0  0  7  9  7  0  0  0  0  0  0  0 
    10  5  5  8  0  0  0  0  0  0  0  0  0 
    Columns 14 through 25 
    2  0  0  0  0  8  8  0  0  0  0  0 
    8  0  0  0  0  0  0  0  0  0  0  0 
    0  0  0  0  0  0  0  0  0  0  0  0 
    0  0  0  0  0  0  0  0  0  0  0  0 
Indexes of result (without zeros): 
    Columns 1 through 13 
    4  2  2  4  3  3  0  1  0  0  1  2  1 
    Columns 14 through 25 
    2  0  0  0  0  1  1  

, 그래서 우리는 두 번째 재 배열을 계속하기 위해 값을 고려하고 그 결과는 다음과 같습니다 은 그래서 시작 지점으로 COL1과 행렬의 나머지는 다음과 같이 재 배열한다 :

result = 
    Columns 1 through 13 
    3  0  0  1  0  0  0  2  0  0  2  0  0 
    4  0  0  5  0  0  0  0  0  0  0  9  0 
    6  0  0  7  9  0  0  0  0  0  0  0  0 
    10  0  0  8  0  0  0  0  0  0  0  0  0 
    Columns 14 through 25 
    2  0  0  0  0  0  0  0  0  0  0  0 
    0  0  0  0  0  0  0  0  0  0  0  0 
    0  0  0  0  0  0  0  0  0  0  0  0 
    0  0  0  0  0  0  0  0  0  0  0  0 

Indexes of result (without zeros): 
    Columns 1 through 13 
    4  0  0  4  1  0  0  1  0  0  1  1  0 
    Columns 14 through 25 
    1  0  0  0  0  1  1  

수행하는 COL5 및 col8에 두 번 더 그 예에서와 같이 필요한만큼, 우리가 원하는 결과에 도달 :

result = 
    Columns 1 through 13 
    3  0  0  1  0  0  0  2  0  0  0  0  0 
    4  0  0  5  0  0  0  0  0  0  0  0  0 
    6  0  0  7  9  0  0  0  0  0  0  0  0 
    10  0  0  8  0  0  0  0  0  0  0  0  0 
    Columns 14 through 25 
    0  0  0  0  0  0  0  0  0  0  0  0 
    0  0  0  0  0  0  0  0  0  0  0  0 
    0  0  0  0  0  0  0  0  0  0  0  0 
    0  0  0  0  0  0  0  0  0  0  0  0 

Indexes of result (without zeros): 
    Columns 1 through 13 
    4  0  0  4  1  0  0  1  0  0  0  0  0 
    Columns 14 through 25 
    0  0  0  0  0  0  0 

을 어느 이 작업을 수행하는 가장 효율적인 방법은 무엇입니까? 제안 사항을 알려주십시오.

미리 감사드립니다.

+0

무엇이 당신의 질문입니까? –

+0

@EitanT 제 질문은이 특정 그룹화를 수행하는 방법을 찾는 것입니다. 가장 효율적인 방법을 찾기 위해이를 최소화하는 것입니다. – professor

+0

혼자서 이미 구현하지 않았습니까? 어떻게 그 결과를 얻었습니까? –

답변

1

귀하의 질문에 대한 언급이 부족하기 때문에 다음 내용은 제가 이해할 수있는 내용을 단계별로 분석 한 것입니다.

result=[3 1 1 1 1 1 6 2 3 6 2 1 6 2 10 3 10 3 8 8 0 0 0 0 0; 
     4 3 3 5 7 5 10 10 4 10 6 9 8 8 0 0 0 0 0 0 0 0 0 0 0; 
     6 4 4 7 9 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; 
     10 5 5 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 

1), 각 열에서 고유 요소의 수를 계산 다만 각 열에 unique를 호출하고 비 제로 요소 수에 :

count = arrayfun(@(n)sum(unique(result(:, n)) ~= 0), 1:size(result, 2)) 

는 다음의 행렬이 있다고 가정하자

2) 열 # 1의 모든 반복되는 요소를 무효화하기 위해, 우리는이 작업을 수행 할 수 있습니다

idx = arrayfun(@(n)ismember(result(:, n), result(:, 1)), 2:N, 'Uniform', 0); 
result(logical([idx{:}])) = 0 

이제 모든 열을 반복하고 모든 고유하지 않은 요소를 무효화해야하므로 루프로 처리합니다. 최종 솔루션은 그러므로 : 도움이

result= 
    3 0 0 1 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
    4 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
    6 0 0 7 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
    10 0 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

희망 : 원하는 결과를 얻을 수

N = size(result, 2); 
ii = 0; 
while (ii <= N) 

    % # Count the number of unique elements in each column 
    count = arrayfun(@(n)sum(unique(result(:, n)) ~= 0), 1:N); 

    % # Advance to the next column with the maximum number of unique elements 
    ii = ii + find(count(:, ii + 1:N) == max(count(:, ii + 1:N)) & count(ii + 1:N), 1); 
    if isempty(ii) 
     break 
    end 

    % # Nullify non-unique elements starting from column i 
    idx = arrayfun(@(n)(ismember(result(:, n), result(:, ii)) & n ~= ii), 1:N, 'Uniform', 0); 
    result(logical([idx{:}])) = 0; 
end 

!

+1

친애하는 선생님, 정말 고마워요. 나는 당신에게 알려지지 않은 것을 도울 수있는 당신의 시간과 노력에 정말로 감사드립니다. 귀하의 솔루션에 자리가 있습니다. @EitanT을 잘하십시오. 추신 나는 당신의 프로필에서 귀하의 이메일을 보지 못합니다, 내 이메일에 저에게 연락 pls. – professor

+1

도와 드리겠습니다. 이것은 무엇을위한 StackOverflow입니다! –