我正在嘗試生成一個矩陣,它具有 [0 0 1 1] 的所有唯一組合,我為此撰寫了以下代碼:
v1 = [0 0 1 1];
M1 = unique(perms([0 0 1 1]),'rows');
? 這并不理想,因為perms()將每個向量元素視為唯一并執行以下操作:
4! = 4 * 3 * 2 * 1 = 24 組合。
? 使用unique()我試圖洗掉所有重復的條目,所以我最終得到了組合矩陣 M1 →
只有[4!/ 2! * (4-2)!] = 6組合!
現在,當我嘗試做一些非常簡單的事情時:
n = 15;
i = 1;
v1 = [zeros(1,n-i) ones(1,i)];
M = unique(perms(vec_1),'rows');
? perms()函式嘗試執行的操作不是獲取[15!/ 1! * (15-1)!] = 15組合
15! = 1.3077e 12 組合,它被打斷了。
? 你會如何以更好的方式做事?提前致謝!
uj5u.com熱心網友回復:
您可以使用nchoosek來回傳應該是 的索引1,我想您心里知道這一定是可能的,因為您正在使用 的定義nchoosek來確定預期的最終排列數!所以我們可以使用:
idx = nchoosek( 1:N, k );
其中N是陣列中元件的數量v1,并且k是具有值元素的數量1。那么這只是創建zeros陣列并填充陣列的一個例子。
v1 = [0, 0, 1, 1];
N = numel(v1); % number of elements in array
k = nnz(v1); % number of non-zero elements in array
colidx = nchoosek( 1:N, k ); % column index for ones
rowidx = repmat( 1:size(colidx,1), k, 1 ).'; % row index for ones
M = zeros( size(colidx,1), N ); % create output
M( rowidx(:) size(M,1) * (colidx(:)-1) ) = 1;
這適用于您的兩個示例,而無需巨大的中間矩陣。
旁白:由于您將使用這種方法獲得索引,因此您可以創建一個sparse矩陣,但這是否是一個好主意將取決于您在此之后要做什么。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/336439.html
