作者liu23829 (做人別太跩)
看板C_and_CPP
標題Re: [問題] 有關矩陣兩列或兩行互換的程式怎麼寫?
時間Sun Jun 20 13:02:26 2010
※ 引述《liu23829 (做人別太跩)》之銘言:
: ※ 引述《liu23829 (做人別太跩)》之銘言:
: 上述A矩陣的第一行為[1/2,0,0,0,1], 鎖定第一行非0元素往上移,要做列的移動,
: : 故移動方式為(R5→R2)第5列與第2列互換,這邊定義Ib1=2
: : 再針對第一行的移動後非0元素[1/2,1]所在的列,做行的移動,使非0元素往左移
: : 0元素往右移,移動前此兩列為[1/2,0,0,0,0,0;1,0,0,2,0,0]移動方式為判別
: : 此兩列中,皆有0元素的行往右移,故應該移動C2→C4
: : 移動後兩列為[1/2,0,0,0,0,0;1,2,0,0,0,0]
: : 再定義移動後,此兩列有一非0元素以上的行有2行(Jb1=2)針對此2行(亦即1、2行)
: : 做列的移動,將非0元素往上移,0元素往下移,發現不用做移動
: : 移動後,此時再定義Ib2=2(此時1、2行裡有一非0元素以上的列還是1、2列)
: : 故得到Ib2=Jb1,皆為2,而形成2x2的區塊,設定T1,整個移動方式其實是
: : 將非0元素往左上方移動,移動的步驟為鎖定行,做列的移動,找到非0元素後
: : 針對非0元素所在的列,再做行的移動,之後再鎖定非0元素所在的行,做列的移動
: : 以此類堆,如果形成某區塊右方和下方皆為0元素即停止,遮閉該區塊所在的行、列
: : 考慮剩下的區塊部分來做移動,當然移動後無法形成某區塊右方和下方
: : 皆為0元素,一樣停止,這是補充說明,有點複雜。
: 再說明一下,這時左上方的區塊T1形成了[0.5,0;1,2]該區塊右方跟下方皆為0元素了
: 故停止這個區塊的移動,考慮右下方這個區塊,設定T2
: T2= 2.0000 0 1.0000 0
: : 0 0.3333 0 0
: : 0 2.0000 3.0000 2.0000
: T2尚未移動,要先照上述的方式移動後,才能判別停止
: 鎖定該區塊的第一行為[2,0,0]故非0元素只有2那一個,Ib1=1,針對2那個元素所在的列
: 做行的互換,非0往左移,0往右移,故需移動C2→C3
: T2= 2.0000 1.0000 0 0
: : 0 0 0.3333 0
: : 0 3.0000 2.0000 2.0000
: 移動後,這時Jb1=2(非0元素所在的行個數,亦即1、2行)也就是[2,1]這2行
: 針對這二行做列的移動,非0往上移,0往下移,需再移動R2→R3
: 移動後T2= 2.0000 1.0000 0 0
: : 0 3.0000 2.0000 2.0000
: 0 0 0.3333 0
: 此時,Ib2(前面鎖定1、2行中,含一非0元素以上所在的列,有2列),因為第二次的列移動
: 故設定Ib2=2,再針對非0元素所在的列,亦即1、2列,做行的移動
: 發現2列中,皆為0元素能移動的行,並沒有,故此時定義了Jb2,因為第二次的行移動
: Jb2=4(前面鎖定1、2列中,含一非0元素以上所在的行,有4行)
: 再針對這4行做列的移動,非0往上移,0往下移,
: 此時也不需做移動,因為只剩0,0,1/3,0這一列
而且此區塊移動整理後,並無法形在某區塊右下和下方皆為0元素,故停止
重點還是“非0元素的移動”,針對鎖定的行,做列的移動,再針對
移動後非0元素所在列做行的移動,以此類推,而判別停止的條件有2
1.形成某區塊右下和下方皆為0元素,則停止,遮閉該區塊所在的行與列,考慮剩下的區塊
2.移動後無法形成右方和下方皆為0元素,也要停止
演算式我想不出來,能幫忙的感激不盡~~~~
--
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.167.147.155
推 yauhh:所以問題是:求演算法使矩陣經運算後,找不到任一區塊其右方行 06/20 13:24
→ yauhh:與下方列存在一行或一列0元素. 這樣對嗎? 06/20 13:25
→ yauhh:這應該有但書:除最右及最下例外之外.另外,區塊至少2x1或1x2? 06/20 13:49
→ yauhh:嗯..你解釋一件東西的用語很有問題耶,你說重點非0元素的移動 06/20 14:49
→ yauhh:這種移動方式也是百百種.為什麼不直接說,讓非0元素向對角線 06/20 14:50
→ yauhh:靠攏,這還比較符合MATLAB板那一串討論的例子的結果. 06/20 14:51