關於Mat矩陣在淺拷貝下的關於矩陣頭的拷貝問題

2021-07-07 05:22:17 字數 1669 閱讀 7285

先貼**:

mat m1 = mat::zeros(4, 4, cv_32fc1);

mat &m2 = m1;

cout

<< "m1.size() = "

<< m1.size() << endl;

cout

<< "m2.size() = "

<< m2.size() << endl;

m2 = m2(range(0,1), range(0,1));

cout

<< "m1.size() = "

<< m1.size() << endl;

cout

<< "m2.size() = "

<< m2.size() << endl;

cout

<< endl;

cout

<< "m2 original value = "

<< endl << m2 << endl;

m1.at(0, 0) = 1;

cout

<< "m2 modified value = "

<< endl << m2 << endl;

mat 是乙個類,由兩個資料部分組成:矩陣

頭 (包含矩陣尺寸,儲存方法,儲存位址等資訊)和乙個指向儲存所有畫素值的矩陣的指標

。矩陣頭的尺寸是常數值,但矩陣本身的尺寸會依影象的不同而不同,通常比矩陣頭的尺寸大數個數量級。因此,當在程式中傳遞影象並建立拷貝時,大的開銷是由矩陣造成的,而不是資訊頭。

在mat a = b 中資訊頭是深拷

貝 ,資料仍然共享,所以: b矩

陣的si

ze改變

不會改變

a的si

ze,反

之亦然 b矩

陣的資料

改變會改

變a的數

據,反之

亦然在淺拷貝下資料已共享下,如果想要a與b的size、儲存型別都共享,即矩陣頭也要共享,則用 引用

引用**如下,m2矩陣的資料改變會改變m1的資料

mat m1 = mat::zeros(4, 4, cv_32fc1);

mat &m2 = m1; //引用後,資訊頭也共享了

cout

<< "m1.size() = "

<< m1.size() << endl;

cout

<< "m2.size() = "

<< m2.size() << endl;

m2 = m2(range(0,1), range(0,1));

cout

<< "m1.size() = "

<< m1.size() << endl;

cout

<< "m2.size() = "

<< m2.size() << endl;

cout

<< endl;

cout

<< "m2 original value = "

<< endl << m2 << endl;

m1.at(0, 0) = 1;

cout

<< "m2 modified value = "

<< endl << m2 << endl;

關於深拷貝和淺拷貝

以nsstring與nsmutablestring舉例 nsstring str1 xfj nsmutablestring str2 str1 mutablecopy nslog str1,str2 nslog p p str1,str2 輸出結果 xfj xfj123 0x102701068 0x...

關於深拷貝與淺拷貝

相關理解 注意 閉包中的變數存在在堆記憶體中而非棧記憶體中。賦值與淺拷貝 array.prototype.slice實現對陣列的淺拷貝 array.prototype.concat將陣列和陣列或和值連線在一起成新的陣列 擴充套件運算子 實現淺拷貝 原理 新的物件複製已有物件中非物件屬性的值和物件屬性...

關於C 的深拷貝與淺拷貝

最近因為我個人正在找工作的原因,被面試到深拷貝與淺拷貝的問題。這個我只是以前聽說過相關的概念,並沒有深究。所以被問到的時候答得不是很好。回來查閱資料與各位大牛的部落格,寫點自己的總結 當用乙個已初始化過了的自定義類型別物件去初始化另乙個新構造的物件的時候,拷貝建構函式就會被自動呼叫。也就是說,當類的...