[問題] 判斷是否在同一行程式
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
C++
問題(Question):
是這樣的,因為一些原因我需要在函數裡判斷這個函數是否在同一行程式裡
被呼叫超過一次
具體例子是這樣:
我想要implement Matlab的取子矩陣的函數
i.e. 一個矩陣A,取他的A([1,2,3],[1,3,4]) 第1 2 3 row 和 第1 3 4 column
但我希望不要每呼叫一次這個子矩陣函數就去new一個新的記憶體空間給這個
子矩陣回傳 [因為我這樣做似乎會大大的增加執行時間]
於是我在這個子矩陣函數裡使用了static的matrix記憶體空間
永遠re-use同一塊記憶體不去重新做記憶體配置
但是這樣子做,我在同一行程式裡呼叫這個函數兩次以上的時候就會出問題
例如說
A([1,2],[1]) + A([3,4],[2])
會因為在子矩陣函數裡只有一個static記憶體,而導致在+之前,
先被呼叫的子矩陣被後來呼叫的子矩陣洗掉
我目前想一個straightforward solution就是說
判斷他是否在同一行程式裡面,是的話就再開一個static matrix
但我不知道怎麼判斷
不曉得能否給些指引,或是有其他更好的做法來處理這樣的問題?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.96.91.150
→
06/04 09:02, , 1F
06/04 09:02, 1F
→
06/04 09:22, , 2F
06/04 09:22, 2F
→
06/04 10:33, , 3F
06/04 10:33, 3F
OK, 我把"子"去掉~
推
06/04 10:43, , 4F
06/04 10:43, 4F
是有點複雜
※ 編輯: GSXSP 來自: 140.96.158.68 (06/04 10:52)
→
06/04 12:11, , 5F
06/04 12:11, 5F
外面宣告變數也是可以,但是使用起來就不方便
沒辦法像Matlab那樣直接 A([1,2],[1]) + A([3,4],[2])
→
06/04 13:01, , 6F
06/04 13:01, 6F
→
06/04 13:02, , 7F
06/04 13:02, 7F
我會用size adaption的方式調整裡面那個static Matrix
如果需要比較大的size就再給他新的空間
如果這次使用是要比較小的size那就把row和col改掉,但原來比較大的記憶體還是在
下次又變大的話就把row和col改回來
→
06/04 13:05, , 8F
06/04 13:05, 8F
如果不同行的話就沒關係
例如說
B = A([1,2,3],[1,3,4]) + C;
X = A([1,2],[1]) + D;
這樣執行起來也不會有什麼問題
因為同一行只需要一個temp值
下一行那個temp值就沒有用了
※ 編輯: GSXSP 來自: 140.96.91.150 (06/04 15:39)
推
06/04 23:47, , 9F
06/04 23:47, 9F
→
06/04 23:48, , 10F
06/04 23:48, 10F
→
06/05 10:10, , 11F
06/05 10:10, 11F
→
06/05 10:11, , 12F
06/05 10:11, 12F
→
06/05 11:02, , 13F
06/05 11:02, 13F
→
06/05 11:03, , 14F
06/05 11:03, 14F
→
06/05 11:15, , 15F
06/05 11:15, 15F
→
06/05 11:16, , 16F
06/05 11:16, 16F
→
06/05 11:17, , 17F
06/05 11:17, 17F
→
06/05 11:18, , 18F
06/05 11:18, 18F
→
06/05 11:21, , 19F
06/05 11:21, 19F
→
06/05 11:21, , 20F
06/05 11:21, 20F
好像還是不行耶
const Matrix& m = A(..);
這樣子m會是 A(..) 這個函數回傳來的東西的alias
也就是我裡面那個static Matrix的alias
再去做 const Matrix& n = A(...);
雖然m是const 但因為裡面那個static matrix在Matrix& n = A(...); 會被修改
m也就變了
而且這樣依舊m=n, 兩個都是裡面那個static Matrix的alias
我測試的結果
A = [1 2;3 4];
const Matrix& m = A.get_row(0); (想要的是[1 2])
const Matrix& m = A.get_row(1); (想要的是[3 4])
m + n的結果卻是 [6 8];
還是說我裡面的static Matrix這樣的做法不好,
有什麼別的方式來配合const Matrix& ?
※ 編輯: GSXSP 來自: 140.96.91.150 (06/05 11:47)
推
06/05 12:01, , 21F
06/05 12:01, 21F
跟我文中描述的submatrix方式類似,我直接貼code好了
Matrix<T> & get_row(int m)
{
static Matrix<T> tmp(1,N_col);
SizeAdaption(tmp,1,N_col);
for(int k=0;k<N_col;k++)
tmp[0][k]=A[m][k];
return tmp;
}
※ 編輯: GSXSP 來自: 140.96.91.150 (06/05 12:44)
→
06/05 23:01, , 22F
06/05 23:01, 22F
回傳object他就必須allocate一份temp Matrix的空間然後copy出去,我測試的結果會很慢
(用Visual C++的Compiler)
→
06/06 00:05, , 23F
06/06 00:05, 23F
對..所以會變[6 8]..我不知道要怎麼解決?
還是說我應該怎麼寫讓他能夠直接用到A本來的記憶體空間,而不是另外開一個static?
但我頂多改row和col,我不知道要怎麼樣修改他
initial pointer的位置和access A(..)[1][2]的方式 (新的submatirx的 [1][2]) ?
※ 編輯: GSXSP 來自: 140.96.91.150 (06/06 10:21)
推
06/06 13:21, , 24F
06/06 13:21, 24F
也沒有想要修改他,就是想要取出來,可以修改就更好了
像是若是寫Matrix B = [0 0] a.GetRow(0)=B
可以讓a變成 [0 0; 3 4]的話就更好了
但如上述我不知道要怎麼讓
a.GetRow(0)這個pointer的intitial position和access的方式改變
[
我的Matrix是用T**implement
如果是取submatrix的話,我不知道他在access element的時候,我要怎麼樣讓
某些記憶體位置(某些col,row) 從他眼中"消失" @@
就是說 A(..)[m][n] 必須是用新的submatrix來算的m和n,
但記憶體位置卻要是本來A裡面的,也就是會跳著算,跳過沒取的row和col
]
→
06/06 13:23, , 25F
06/06 13:23, 25F
→
06/06 13:24, , 26F
06/06 13:24, 26F
對~就是想跟Matlab的一樣
r0就是第一排row這個2x1的Matrix [1 2],而r1就是第二排row這個2x1的Matrix [3 4]
所以r0+r1 = [4 6]
※ 編輯: GSXSP 來自: 140.96.91.150 (06/06 14:08)
※ 編輯: GSXSP 來自: 140.96.91.150 (06/06 14:17)
→
06/06 20:35, , 27F
06/06 20:35, 27F
→
06/06 20:35, , 28F
06/06 20:35, 28F
→
06/06 20:36, , 29F
06/06 20:36, 29F
我其實不是很確定他慢的原因
對我來說是因為return object時他需要allocate一個temp記憶體來接,所以才會慢
他allocate好之後的 copy value 的動作應該不太佔時間
我目前 "=" 的做法就是
Matrix<T>& operator=( const Matrix<T>& A1 )
{
if( &A1 != this )// Equal to itself
{
if(N_row == A1.get_N_row() && N_col == A1.get_N_col())
{
for(size_t m=0;m<N_row;m++)
for(size_t n=0;n<N_col;n++)
A[m][n]=A1[m][n];
}
else
{
//cout<<"Avoid this (=) is better"<<endl;
build( A1.N_row, A1.N_col, A1.A );
}
}
return *this;
}
大部分情況都會進if( N_row == A1.get_N_row() .....)
包含return object時候的copy
所以就是直接把value給過去
不曉得這一部分會是原因嗎?
※ 編輯: GSXSP 來自: 1.169.171.80 (06/06 22:01)
→
06/06 22:24, , 30F
06/06 22:24, 30F
→
06/06 22:25, , 31F
06/06 22:25, 31F
→
06/07 10:42, , 32F
06/07 10:42, 32F