2013年3月2日 星期六
哈哈!弄出來了!
兩三年前,開始學習由Matlab呼叫C++語言,當時建立一批小程式,將不同數目及維度的矩陣由Matlab向C++傳遞,在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!,再測非方形矩陣。
成功了!時間:晚上8點20。
哈哈,我的大腦已經開始老人癡呆,竟然還如此忠心耿耿,在睡夢中幫我解決難題。
記錄如下:
兩個矩陣,*(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))); 」可是心血結晶。
留言列表