2012-12-02 83 views
0

我們有以下的矩陣resultMatlab的:分組和最小化矩陣的唯一列元素的索引

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 

現在我們需要遍歷所有列並取消所有非唯一元素,所以我們用循環來完成。因此,最終的解決方案是:

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 

這將產生你想要的結果:

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 

希望幫助!

+1

親愛的先生,非常感謝。我真的很感激你的時間和精力來幫助一個未知的人。你的解決方案是現貨。做得好@EitanT。附:我沒有在您的個人資料中看到您的電子郵件,請通過我的電子郵件與我聯繫。 – professor

+1

很高興幫助。這是StackOverflow的用途! –

相關問題