Re: [問題] 符合條件的隨機矩陣已回收
※ 引述《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)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
MATLAB 近期熱門文章
PTT數位生活區 即時熱門文章