2013-10-25 165 views
-3

我想控制在該矩陣中的隨機數的產生:矩陣1,2,3如何生成?

Mp = floor(1+(10*rand(2,20))); 
mp1 = sort(Mp,2); 

我想修改此代碼,以便具有這樣的輸出:

1 1 2 2 3 3 3 4 5 5 6 7 7 8 9 9 10 10 10 10 
1 2 3 3 3 3 3 3 4 5 6 6 6 6 7 8 9 9 9 10 

我必須填充每個行隨着所有數字從1到10遞增順序,並且第二個矩陣計算每個數字的出現應該是這樣的:

1 2 1 2 1 2 3 1 1 2 1 1 2 1 1 2 1 2 3 4 
1 1 1 2 3 4 5 6 1 1 1 2 3 4 1 1 1 2 3 1 

d從上週開始我一直在尋找的最棘手的矩陣是第三個矩陣,它應該通過第一個矩陣的每一行,並返回每個數字的出現次數和最後一次發生的位置。這裏有一個代碼應該如何工作的例子。此示例顯示了穿過第一個矩陣的第一行之後的預期結果。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 (positions) 
1  2  
2   2 
3    3 
4     1 
5      2    
6       1 
7        2      
8         1 
9          2 
10             4 

(數字)

這個例子中示出通過所述第一矩陣的第二行運行後的預期的結果。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 (positions) 
1 1 2  
2  1 2 
3    3 6 
4     1 1 
5      3    
6       1   4 
7        2  1    
8         1  1 
9          2   3 
10             4 

(數字)

所以想要的矩陣必須從一開始就通過第一矩陣中的每一行運行後各一次零填滿,我們添加了新的結果與前一個。 ..

+0

看起來像一個非常本地化的問題。你關心代碼不是超高效嗎? – Floris

+0

「我想修改這段代碼,以便得到這樣的輸出:」不要得到你想修改的東西?代碼已經是您的輸出。 – Daniel

+2

@Sam:你已經問過這個問題的至少一部分。你到那裏的答案有什麼問題?你爲什麼再問一次? http://stackoverflow.com/questions/19552147/how-can-i-generate-this-matrix – Daniel

回答

0

我相信下面的代碼可以完成您要求的所有功能。如果我不明白,你需要更清楚地說明你如何提出你的問題......

注 - 我硬編碼了一些值/大小。在「真正的代碼」中,顯然你永遠不會這麼做。

% the bit of code that generates and sorts the initial matrix: 
Mp = floor(1+(10*rand(2,20))); 
mp1 = sort(Mp, 2); 
clc 
disp(mp1) 

occCount = zeros(size(mp1)); 

for ii = 1:size(mp1,1) 
    for jj = 1:size(mp1,2) 
     if (jj == 1) 
      occCount(ii,jj) = 1; 
     else 
      if (mp1(ii,jj) == mp1(ii,jj-1)) 
       occCount(ii,jj) = occCount(ii, jj-1) + 1; 
      else 
       occCount(ii,jj) = 1; 
      end 
     end 
    end 
end 

% this is the second matrix you asked for 
disp(occCount) 

% now the third: 
big = zeros(10, 20); 
for ii = 1:size(mp1,1) 
    for jj = 1:10 
     f = find(mp1(ii,:) == jj); % index of all of them 
     if numel(f) > 0 
      last = f(end); 
      n = numel(f); 
      big(jj, last) = big(jj, last) + n; 
     end 
    end 
end 

disp(big) 

請看看這是否確實是你的想法。

0

我編輯以前的答案,以檢查它是否快時MP1大,顯然它是:

N = 20000; M = 200; P = 100; 
mp1 = sort([repmat(1:P, M, 1), ceil(P*rand(M,N-P))], 2); 
tic 
% Initialise output matrices 
out1 = zeros(M, N); out2 = zeros(P, N); 
for gg = 1:M 
    % Frequencies of each row 
    freqs(:, 1) = mp1(gg, [find(diff(mp1(gg, :))), end]); 
    freqs(:, 2) = histc(mp1(gg, :), freqs(:, 1)); 
    cumfreqs = cumsum(freqs(:, 2)); 
    k = 1; 
    for hh = 1:numel(freqs(:, 1)) 
     out1(gg, k:cumfreqs(hh)) = 1:freqs(hh, 2); 
     out2(freqs(hh, 1), cumfreqs(hh)) = out2(freqs(hh, 1), cumfreqs(hh)) + freqs(hh, 2); 
     k = cumfreqs(hh) + 1; 
    end 
end 
toc 
+0

謝謝你們所有人的幫助,你們真的是美麗的頭腦和天才! @丹尼爾R你昨天給我的代碼完全適用於第二代矩陣,@弗洛里斯你的代碼完全符合我的想法和我所解釋的內容。第一個矩陣仍然有問題 – Sam

+0

第一個矩陣應該有隨機數,按照遞增順序從1開始,始終以10結束並生成1到10之間的所有數字。上面的代碼生成隨機數,但有時以數字2開頭並直接跳到數字4而不產生數字3.這裏的問題是,我想控制隨機數發生器,以便滿足我想要的數字 – Sam

+0

第一個矩陣的一行示例:1 1 1 1 1 1 1 1 1 1 2 3 4 5 6 7 8 9 10 10 – Sam

0

下面的代碼解決了這兩個同一個循環的第二和第三矩陣生成問題。爲了清楚起見,第二個矩陣M2是包含累積發生次數的示例中的2-by-20數組。第三矩陣M3是在編碼每個唯一值的最後出現次數和位置的示例中的大小爲10-by-20的稀疏矩陣。該代碼僅循環遍歷行,使用accumarray來完成大部分工作。它被推廣到任何大小和內容的mp1,只要行先排序即可。

% data 
mp1 = [1 1 2 2 3 3 3 4 5 5 6 7 7 8 9 9 10 10 10 10; 
     1 2 3 3 3 3 3 3 4 5 6 6 6 6 7 8 9 9 9 10]; % the example first matrix 
nuniq = max(mp1(:)); 

% accumulate 
M2 = zeros(size(mp1)); 
M3 = zeros(nuniq,size(mp1,2)); 

for ir=1:size(mp1,1), 
    cumSums = accumarray(mp1(ir,:)',1:size(mp1,2),[],@numel,[],true)'; 
    segments = arrayfun(@(x)1:x,nonzeros(cumSums),'uni',false); 
    M2(ir,:) = [segments{:}]; 
    countCoords = accumarray(mp1(ir,:)',1:size(mp1,2),[],@max,[],true); 
    [ii,jj] = find(countCoords); 
    nzinds = sub2ind(size(M3),ii,nonzeros(countCoords)); 
    M3(nzinds) = M3(nzinds) + nonzeros(cumSums); 
end 

我不會打印輸出,因爲它們對於答案有點大,代碼可以按原樣運行。

注意:對於新的測試數據,我建議使用命令Mp = randi(10,[2,20]); mp1 = sort(Mp,2);。或根據您的要求user2875617和他的迴應,確保所有號碼與mp1 = sort([repmat(1:10,2,1) randi(10,[2,10])],2);,但這不是真的隨機...

編輯:代碼修正錯誤。