作者hsucheng (Marshall)
看板C_and_CPP
標題[問題] 一維陣列,元素個數放大?
時間Sat Dec 17 14:48:49 2016
開發平台(Platform): (Ex: Win10, Linux, ...)
Win 7
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
Visual Studio 2015 C++
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
opencv
問題(Question):
假設有兩個陣列
int a[2000]; 元素個數=1234
int b[2000]; 元素個數=1789
想把他們全部放大到有2000個元素,之後兩個陣列內容要比大小
Diff = Diff + abs(a[cnt] - b[cnt]);
陣列數目不同無法比,所以想讓他們正規化
請問有沒有簡單容易實做的方法?
目前只能想到用內插補資料,但整體放大的方法要如何做呢?
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 163.18.57.175
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1481957331.A.E05.html
1F:→ stupid0319: tiida 12/17 15:37
這跟念大悲咒是一樣的RRRRRRR
2F:推 ilikekotomi: 最簡單應該是一開始大小就用500 12/17 15:59
謝謝,我突然發現用錯表達方法,
陣列宣告時都用5000,但演算法算完後,
每個陣列的元素個數會不一樣
3F:推 chuegou: 只能放大嗎 不能縮小? 縮小不用補資料 12/17 16:08
可以,主要目的是讓大家的元素個數一樣
像我題目說B的元素有到1789,
因為A沒有index=1789的值,
會造成演算法錯誤
不知大大能否提點一下如何做呢?
4F:→ stupid0319: 用link吧,伸縮自如跟海綿寶寶一樣 12/17 16:37
5F:推 sorryla: 看起來不是陣列的問題 比較像是演算法的問題 12/17 16:48
6F:推 EdisonX: 演算法問題 +1 12/17 19:58
謝謝,我還是貼個圖好了
http://imgur.com/a/qWwXq
我表達有誤,應該說是,演算法算出來就會是這樣
算出來後等於左邊兩張圖,一個橫軸300多,一個橫軸400初
要經過放大縮小的正規化,會變成右邊,大家的橫軸都是500
不好意思一直沒表達清楚
7F:推 LPH66: 所以這是演算法問題無誤, 你要的不是補資料是拉伸資料 12/17 21:32
8F:→ LPH66: 那你就要考慮你的資料必須要怎麼延伸才會有意義 12/17 21:32
9F:→ LPH66: 一個類似的例子 (但「非常可能和你要的不同」) 是圖片縮放 12/17 21:33
10F:→ LPH66: 然後另外一個考慮的點: 你的演算法是否要求等長資料? 12/17 21:35
11F:→ LPH66: 如果「等長」這個點不是重點的話你應該是改演算法去適用 12/17 21:36
12F:→ LPH66: 注意我指的不是演算法的細節而是這演算法到底在算什麼東西 12/17 21:37
感謝
一直忘記說明,這個是手勢的影像辨識,h是手勢的輪廓
因為每張圖的輪廓長度不一樣,造成現在這個問題
主要是想把左邊橫軸不一樣的資料,轉成右邊那10張橫軸都一樣的
困難點在於,a[100]轉成a[200]很簡單,全部內插1格就好
但是a[57]轉成a[200],或是b[123]轉成b[200],這種scale不一樣的不知道該如何寫
※ 編輯: hsucheng (36.238.65.200), 12/17/2016 23:11:14
13F:→ EdisonX: 那你有最原始 2000 個點的資料嗎?如果沒有的話我想直接 12/18 01:41
14F:→ EdisonX: 先轉到 max(asize,bsize) 維度即可? 12/18 01:41
15F:→ EdisonX: 若轉到 2000 個點,用最笨的最近補點法的概念下去做應可行 12/18 01:42
16F:→ LPH66: 可不可行其實要看原 PO 之後要做什麼操作 12/18 02:29
17F:→ LPH66: 所以才會問他說之後的操作演算法有沒有要求等長資料 12/18 02:30
18F:→ LPH66: 依操作不同有些資料不能貿然做內插/最近補點/etc 12/18 02:31
19F:→ EdisonX: 他有要等長啊!上面有個公式有講了 12/18 02:31
20F:→ EdisonX: Diff = Diff + abs(a[cnt] - b[cnt]); 這個前提應就是 12/18 02:31
21F:→ EdisonX: 要等長吧 ?? 還是我誤會了 ?? 12/18 02:32
22F:→ EdisonX: 不過照整個述敘看起來,原 po 想要的,應該是去計算,兩 12/18 02:33
23F:→ EdisonX: 個波型數值的相似度,最後那明顯是種 MSE 12/18 02:33
24F:→ EdisonX: 若猜對的話,就用內插法吧。 12/18 02:34
27F:→ EdisonX: 再補一下好了,我想原 po 要做的是幾個手勢做判斷,而特 12/18 02:45
28F:→ EdisonX: 徵點的取得個數不同,所以想先展開,但展開要件是波形要 12/18 02:46
29F:→ EdisonX: 和原本長得像,再去做 MSE 計算。而我 code 裡的內插法 12/18 02:47
30F:→ EdisonX: 主要是補點加權,假設 mapping 到的是 dst[0]=src[6.7] 12/18 02:47
31F:→ EdisonX: 則 src[0] = dst[6]*0.3 + dst[7]*0.7 12/18 02:48
32F:→ EdisonX: 若猜錯的話... 額 .. 就略過我的發言吧 Orz 12/18 02:48
33F:→ EdisonX: 疑!我看懂 LPH66 敘述了,那請問,若不展開變等長的話, 12/18 02:52
34F:→ EdisonX: 有什麼方法可以判斷兩個,取樣點數不同之波型是否相似呢? 12/18 02:53
35F:推 LPH66: 嘛, 我只是單純因為不知道他要做什麼運算才會提醒注意的 12/18 03:37
36F:→ LPH66: 你這個問題似乎是屬於訊號分析的範圍, 那個我沒什麼在接觸 12/18 03:38
37F:→ LPH66: 但也因為他這個問題似乎真的有摸到這個邊所以才會想到 12/18 03:38
38F:→ LPH66: 經過內插/補點/etc之後的訊號失真問題 12/18 03:39
39F:→ EdisonX: 剛查了一下,波型相似的算法的確不少,像fft,match patt 12/18 14:04
40F:→ EdisonX: ern等,方向確實很廣。 12/18 14:04
41F:推 noodleT: 把資料分別做擬合曲線後,比較兩個曲線是否一樣 12/18 17:43
42F:→ hichcock: 樓上正解~ 12/19 08:46
43F:→ doom8199: 以原po需求可以用 Dynamic Time Warping 12/20 13:17
44F:推 longlongint: 抓出features 12/23 22:25