201332 星期六


 


哈哈!弄出來了!


 


兩三年前,開始學習由Matlab呼叫C++語言,當時建立一批小程式,將不同數目及維度的矩陣由MatlabC++傳遞,在C++中演算後,傳回Matlab


 


其中,「矩陣相乘」始終不成功。


 


矩陣相乘是基本的編程技巧,問題不在此,問題在於,正規語言編寫的矩陣相乘程式,Visual Studio C++不接受!!


 


Matlab呼叫C++時,是用Pointer傳遞參數,因此multi[row][col]的形式不能用。而 *(*(multi + row) + col)的編程方式Visual Studio C++不接受。


 


這幾天,重新審視這個問題。


 


兩三天,苦不得解。


 


以前的經驗,若有重大問題解不出來,在睡前用腦子思考,直到入睡。這會使大腦在夜間睡夢中偷偷工作。


 


我靠此方法解決過不少重大困難。


 


還記得有一次,早上一醒,立刻哈哈而笑,因為大腦已經在夜裡找到答案,立刻起床打開工作,果真問題解決。


 


昨晚睡前思考這問題,夜裡,感覺大腦在解這問題,似乎沒有直接找到答案,但找到一個方向。


 


早上起來,立刻根據夜裡大腦所得,鋪開紙張,把矩陣演算的元素全部展開,一個一個比對。


 


得出一個式子,可以做方矩陣的乘法!


 


已經成功一半。


 


一整天,思考非方矩陣的乘法,也就是,例如3x2的矩陣與2x3的矩陣相乘。


 


一整天都不成功。


 


晚上,再次把非方矩陣的元素展開,一個一個比對,發現,早上的公式,有兩個variable更換一下,似乎就可,也就是,把n換成m,把q換成p


 


檢驗,似乎成功。


立刻放進C++程式,先重測方矩陣,OK!,再測非方形矩陣。


 


成功了!時間:晚上820。


 


哈哈,我的大腦已經開始老人癡呆,竟然還如此忠心耿耿,在睡夢中幫我解決難題。


 


記錄如下:


 


兩個矩陣,*(inA) *(inB),前者尺寸(mxn),後者尺寸(pxq),相乘後得尺寸為(mxq)之矩陣*(outC),其C++ code 如下:


 


for (i=0;i<m;i++)


{  


        for (j=0;j<q;j++)        // Achtung, it is "q"


        {


                *(outC+(j*m+i))=0;  // appears no influence


                for (k=0;k<n;k++)


        {      


                        *(outC+(j*m+i)) += *(inA+(k*m+i))*(*(inB+(j*p+k)));  // works perfect !


                }


        }


}


 


這個演算中的「*(outC+(j*m+i)) += *(inA+(k*m+i))*(*(inB+(j*p+k))); 」可是心血結晶。


 


 


 


 
arrow
arrow
    全站熱搜

    海歌 發表在 痞客邦 留言(0) 人氣()