[問題] 有快速將二維vector賦值的方法嗎?

看板C_and_CPP作者 (別講那些五四三)時間12年前 (2012/06/11 17:51), 編輯推噓8(8041)
留言49則, 12人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Borland C++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) opencv 不過應該沒啥影響 問題(Question): 用途是影像處理 struct cost{ int occR; int occL; int R; int G; int B; int visibility; int disparity; }; 用cost這個struct建了一個全域的二維vector warp[375][450],warp大小即為圖像大小 因為演算法需要,warp需要重複的使用,次數大概是6千多次 但是每次使用前必須賦予初始值 PS.不一定是0,可能是-1 or -2,但一樣的類別就是一樣的值 warp[][].occR=-2 warp[][].R=0 大概是這樣 於是我另外創了一個非全域的二維vector warp_temp[375][450],一樣的struct 裡面都先丟好我要的初始值,當要使用到warp的時候,再將warp = warp_temp即可 這樣的寫法說實在真的很慢,因為struct裡面有7個int 光是初始化而已,就可以耗掉我10幾秒的時間,還沒加上演算法 請問有更好的解法嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.32.238.115 ※ 編輯: wayne0411 來自: 114.32.238.115 (06/11 17:52)

06/11 17:53, , 1F
initial ctor?
06/11 17:53, 1F
※ 編輯: wayne0411 來自: 114.32.238.115 (06/11 17:55)

06/11 18:11, , 2F
改用CLASS 建構子 會不會比較快0.0
06/11 18:11, 2F
收到,我試試看 剛剛把cost改寫 struct cost{ bool occR; bool occL; BYTE R; BYTE G; BYTE B; bool visibility; unsigned int disparity; }; 這樣速度大概是6~7秒,果然int挺肥大的XDD ※ 編輯: wayne0411 來自: 114.32.238.115 (06/11 18:16)

06/11 20:47, , 3F
如果只是要做比較簡單的事情 用一維的速度應該比較快
06/11 20:47, 3F

06/11 20:54, , 4F
我倒覺得 struct 作法沒什麼問題說
06/11 20:54, 4F

06/11 21:18, , 5F
你把struct裡的成員重排一下,看能不能再少一次io
06/11 21:18, 5F

06/11 21:18, , 6F
c++我幾乎不懂,只是一個想法
06/11 21:18, 6F

06/11 22:22, , 7F
你或許需要一個static成員變數與一個可以讀取這個變數的初
06/11 22:22, 7F

06/11 22:22, , 8F
始建構子
06/11 22:22, 8F

06/11 22:24, , 9F
樓上指的是初始化時去讀取但不寫入吧 ?
06/11 22:24, 9F

06/11 22:28, , 10F
如果是我,我會寫成class,然後用init list
06/11 22:28, 10F

06/11 22:44, , 11F
樓上請問有範例嗎? vector是動態的,我用class兜不起來
06/11 22:44, 11F

06/11 22:49, , 12F
真妙,wayne0411 用的是 vector< vector<cost> > 吧 ?
06/11 22:49, 12F

06/11 22:50, , 13F
我用 cost wrap[WIDTH][HEIGHT] 必 stack overflow.
06/11 22:50, 13F

06/11 23:00, , 14F
沒錯,從板上找出來的二維vector宣告方法
06/11 23:00, 14F

06/11 23:04, , 15F
oh, 這個前提下會有很多討論空間了..
06/11 23:04, 15F

06/11 23:04, , 16F
http://ideone.com/6rQRL 大概是這個感覺
06/11 23:04, 16F

06/11 23:04, , 17F
<小提一下,其實這問題用 multi-thread 很好解,沒同步問題>
06/11 23:04, 17F
事實上,現在搞得這個演算法真的很想用sulti-thread下去弄 因為效率真的很差(雖然老闆是說有效果就OK,速度不計>< 一方面沒去學 一方面時間很緊繃,碩三的六月XD

06/11 23:05, , 18F
我沒用到指標所以35行直接assign應該不會有
06/11 23:05, 18F

06/11 23:06, , 19F
memory leak吧?另外我31行怎麼會錯?
06/11 23:06, 19F

06/11 23:07, , 20F
常用的multi-thread是用OpenCL嗎?好像gnu內建就有
06/11 23:07, 20F
※ 編輯: wayne0411 來自: 114.32.238.115 (06/11 23:15)

06/11 23:13, , 21F
oh, 我的方法很笨,丟 _beginthread
06/11 23:13, 21F

06/11 23:19, , 22F
windows only?
06/11 23:19, 22F

06/11 23:29, , 23F
我查好像要windows.h
06/11 23:29, 23F

06/11 23:32, , 24F
BCB 有 linux 的嗎 ? 沒有的話也可以用。
06/11 23:32, 24F

06/11 23:32, , 25F
抱歉,沒注意到原po是用bcb
06/11 23:32, 25F

06/12 00:42, , 26F
OpenMP, 不過 bcb 支不支援就不知道了...XD
06/12 00:42, 26F

06/12 00:56, , 27F
請問你是用BP再算DIBR嗎?
06/12 00:56, 27F
不算是,但是目的相同,對初始Depth做優化

06/12 01:08, , 28F
openmp 撰碼上應會較容易,bcb 也支援 openmp 無誤。
06/12 01:08, 28F

06/12 01:12, , 29F
<不過說實在話,我很懷疑這段真的會是瓶頸問題..>
06/12 01:12, 29F
openmp剛看了一下相當吸引人,有時間的話來try一下 EdisonX大說的是(汗顏 這段當然不是瓶頸,只是好奇有沒有別的方法可以把這簡單步驟弄得更快罷了XD 當然也感謝回覆的前輩們 附帶一提,秒數是用i5 520m跑的,要是用lab舊電腦跑可能就完了,小弟功力尚淺阿阿Orz ※ 編輯: wayne0411 來自: 114.32.238.115 (06/12 01:20)

06/12 01:39, , 30F
放建構子或建構list
06/12 01:39, 30F

06/12 11:47, , 31F
原po為何不直接創7個一維陣列?
06/12 11:47, 31F

06/12 11:48, , 32F
例如 bool *occ_L, *occ_R;
06/12 11:48, 32F

06/12 15:50, , 33F
七個一維這樣會比較快?!
06/12 15:50, 33F

06/12 16:42, , 34F
warp = warp_temp 這個它有聰明到只用copy的嗎 會不會
06/12 16:42, 34F

06/12 16:43, , 35F
dtor ctor叫很多次 而且2維vector空間不連續 如果大小已
06/12 16:43, 35F

06/12 16:43, , 36F
固定 配成連續的會較好
06/12 16:43, 36F

06/12 16:44, , 37F
連續的 然後用memcpy 這樣也許會快很多
06/12 16:44, 37F
下面EdisonX有說了,vector1=vector2這是我試到目前最快的 也許vector本身就有優化吧?!

06/12 17:39, , 38F
如果用c的陣列就有很多快速的作法吧 例如把整個temp用
06/12 17:39, 38F

06/12 17:40, , 39F
memcpy拷貝過去或者將七個一維byte陣列作memset之類的
06/12 17:40, 39F

06/12 17:42, , 40F
如果真的是效能瓶頸 不須排斥用原始的方法處理
06/12 17:42, 40F

06/12 18:07, , 41F
一般影像處理都是把圖當成一維陣列來傳輸
06/12 18:07, 41F

06/12 18:07, , 42F
原po那樣的寫法不僅速度慢,也很容易把程式寫死
06/12 18:07, 42F

06/12 18:08, , 43F
另外建議 disparity 存成 double format
06/12 18:08, 43F

06/12 18:09, , 44F
若你是想做 depth 改善的話...
06/12 18:09, 44F
請問前輩何解?! 小弟的觀念disparity是整數型態的 宣成double,空間跟速度都會受到影響吧?

06/13 23:09, , 45F
不考慮 multi-thread 去解的話,其實原 po 的寫法速度比
06/13 23:09, 45F

06/13 23:10, , 46F
memcpy 快唷<弄成一維也一樣>,vector在開o2後速度奇快 !!
06/13 23:10, 46F
真的不算慢,只是struct裡面的資料型態會"嚴重"影響速度 資料範圍越廣的型態,影響速度越多 ※ 編輯: wayne0411 來自: 114.45.175.234 (06/14 20:46)

06/14 23:28, , 47F
我之前拿你的 sample 試過, vector 開二維直接 assigned,
06/14 23:28, 47F

06/14 23:29, , 48F
速度比 memcpy 快 20% 左右 <是拿你的 struct 試的>
06/14 23:29, 48F

06/21 21:18, , 49F
如果可能,應把它放到 4 byte 裡,用 macro 做 operation
06/21 21:18, 49F
文章代碼(AID): #1FrR-Tnu (C_and_CPP)