Re: [問題] 符合條件的隨機矩陣已回收

看板MATLAB作者 (小太保)時間16年前 (2009/05/20 15:55), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/2 (看更多)
※ 引述《kunlin999 (max)》之銘言: : 今欲製作數個(隨機產生)矩陣滿足 : 1. 方陣 n*n (n給定) : 2. 對稱矩陣 : 3. 對角線元素都是0 : 4. 其他元素的值為0或1 : 5. 列和(或行和)為m_1,m_2,...,m_n (m_1,m_2,...,m_n事先給定) : 譬如說想隨機產生1000個,該如何弄呢? 我只寫產生一個的範例,產生 1000 個就再包個迴圈即可。範例 裡頭為了方便起見 n 我設 10, m 我並用了自己給定的值。 n=10; % 假設 n=10 m=[3 4 4 5 6 6 7 8 8 9]; % 我自訂 10 個 m_x 如左 newmats=zeros(n,n); mats=zeros(1,n); for i=1:n-1 % 最後一列的結果會經由元素的自動對稱而產生 tmp=mats; k=i+randperm(n-i); ss=sum(newmats(i,:)); if m(i)-ss > n-i % 判斷 m 的必要程式段(然後我再加上自動修正) m(i)=n-i+ss; end tmp(k(1:m(i)-ss))=1; newmats(i,i+1:n) = tmp(1,i+1:n); for j=i+1:n if newmats(i,j) > 0 % 做元素自動對稱用的 newmats(j,i) = 1; end end 執行結果如下... ans = 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 0 1 1 1 0 1 1 1 0 1 1 0 1 0 1 1 0 0 1 0 1 1 0 1 1 1 0 0 0 0 1 0 1 0 1 1 1 1 1 1 0 1 1 1 0 1 1 0 0 0 1 1 1 1 1 0 1 1 1 1 1 0 0 1 1 1 0 然後原先的 m = [3 4 4 5 6 6 7 8 8 9] 調整過後的 m = [3 4 4 5 6 6 5 8 6 9] m(i) 有時候若不調整程式會出現 bug,原因是當你已經在做 第 i 列,而 i 已經大於 n/2 時,你就必須考量第 i 列之前 已經做的改變。(條件2: 該方陣元素必須對稱) 也就是說假設你做到第 6 列了, 這一列可能已經有值了例如 newmats(6,:) = [ 1 0 0 1 0 0 0 0 0 0 ]; ^^^^^^^尚未被調整的值 運算到第 6 列時,我只處理第 6+1~10 個值。 sum(newmats(6,:)) 這時已經有值 = 2 了,因此,如果你的 m_6 不小心給 1 那自然無法產生符合你要求的矩陣。 上面的程式,matlab+數學概念佔 25% 左右,舊程式概念寫 法佔 75%,不過 matlab 語法部份還是佔比較少,不推薦^^; (寫 matlab 程式還是盡量多多使用 matlab 內建好的 tool 或 function 如 resharp 大概可以用在這題) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ※ 編輯: laechan 來自: 220.131.226.103 (05/20 15:57)
文章代碼(AID): #1A4xU9lW (MATLAB)
文章代碼(AID): #1A4xU9lW (MATLAB)