作者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/cn.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