2017-08-01 48 views
2

我想建立一個矩陣,其中我們不僅有一個「」在每一行中,而且在一個隨機位置中的每一行的非零元素。例如生成一次只能有一個矩陣

enter image description here

我想矩陣的大小尺寸m by n的。這個任務看起來很簡單,但我不確定什麼是乾淨利落的做法。謝謝。

回答

1

我建議以下方法:

N = 3; M = 6; %defines input size 
mat = zeros(M,N); %generates empty matrix of NxN 
randCols = randi([1,N],[M,1]); %choose columns randomally 
mat(sub2ind([M,N],[1:M]',randCols)) = 1; %update matrix 

結果

mat = 

0  0  1 
1  0  0 
0  0  1 
0  0  1 
0  1  0 
0  1  0 
1

這將得到1的數量放在每列,因爲它只有1,我們被授予轉置後,新的矩陣將在每一行中只有一個1。

參數是生成矩陣中的行數和列數。

function [M] = getMat(n,d) 
    M = zeros(d,n); 
    sz = size(M); 
    nnzs = 1; 
    inds = []; 
    for i=1:n 
     ind = randperm(d,nnzs); 
     inds = [inds ind.']; 
    end 
    points = (1:n); 
    nnzInds = []; 
    for i=1:nnzs 
     nnzInd = sub2ind(sz, inds(i,:), points); 
     nnzInds = [nnzInds ; nnzInd]; 
    end 
    M(nnzInds) = 1; 
    M = M.'; 
end 

例子:

getMat(5, 3) 

ans = 

    0  0  1 
    1  0  0 
    0  1  0 
    1  0  0 
    0  0  1 
0

考慮使用此方法:

% generate a random integer matrix of size m by n 
m = randi(5,[5 3]); 

% find the indices with the maximum number in a row 
[Y,I] = max(m, [], 2); 

% create a zero matrix of size m by n 
B = zeros(size(m)); 

% get the max indices per row and assign 1 
B(sub2ind(size(m), 1:length(I), I')) = 1; 

結果:

B = 

    0  1  0 
    0  0  1 
    1  0  0 
    0  1  0 
    1  0  0 

參考:Matrix Indexing in MATLAB