Re: [問題] 產生一個特殊的矩陣已回收

看板MATLAB作者 (楓霧)時間15年前 (2010/04/28 16:54), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串2/3 (看更多)
我也找不到那篇了 不過我那時候有寫一個程式 就是一直跑迴圈try 不過只能跑到20X20 在上去就幾乎跑不出來了 可以參考看看 程式的主要流程 1) 先產生第一行依照距離亂數產生3個1 假設SIZE是15的話,位置1到5亂數產生1、位置6到10亂數產生1、距離11到15亂數產生1 這個做主要是防止數字擠在一起,例如:位置1到5裡面產生3個1,這種情況下 很有可能產生的矩陣不是所要的,所以要避免這種情形 2) 然後換第一列,如果已經有1,就依照距離亂數產生2個1;沒有就產生3個1 3) 再換第二行,以此類推。然後期間會去檢查剩下的位置夠不夠產生1 還是某一行列的1已經超過3個了 下面是程式碼 %主程式 %function genans SIZE = 20; %矩陣大小 SIZE X SIZE iteration = 10000; %迴圈次數 for n = 1:iteration [out,correct] = genmatrix(SIZE); if(correct == 0) %0表示跑出來的結果是對的 1或2都是錯誤的 break; end end %副程式一 function [out,correct] = genmatrix(SIZE) out = zeros(SIZE,SIZE); correct = 0; for n = 1:SIZE numberone = sum(out(:,n)); if(SIZE-n+1<3-numberone) correct = 1; break; end if(numberone<3) out(n:SIZE,n) = genrand(SIZE-n+1,3-numberone); end numberone = sum(out(n,:)); if(SIZE-n<3-numberone) correct = 1; break; end if(numberone<3) out(n,n+1:SIZE) = genrand(SIZE-n,3-numberone); elseif(numberone>3) correct = 2; break; end end %副程式二 function out = genrand(len,number) nround = round(len/number); out = zeros(1,len); location = zeros(1,number); if number==1 location(1) = randint(1,1,[1,len]); elseif number==2 location(1) = randint(1,1,[1,nround]); location(2) = randint(1,1,[nround+1,len]); else location(1) = randint(1,1,[1,nround]); location(2) = randint(1,1,[nround+1,2*nround]); location(3) = randint(1,1,[2*nround+1,len]); end out(location) = 1; -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.118.207.32

04/28 17:07, , 1F
謝謝你~~ 馬上來試試 ^^
04/28 17:07, 1F
文章代碼(AID): #1Br_V38j (MATLAB)
文章代碼(AID): #1Br_V38j (MATLAB)