w*********e 发帖数: 286 | 1 如题,在做一个筛选,需要从大量数据中找到一些outlier,用matlab写了一个for loop
,每次把找到的sample写进一个vector,有没有比较方便的函数?现在是先定义一个初
始变量为[],然后concatenate一下,总感觉效率不高,速度太慢。。。。 |
e*********6 发帖数: 3453 | 2 你说慢在哪里?从算法看应该是O(n)应该就是最好了。如果觉得要反复擦写内存,就数
数有几个outliner,再开辟空间,再过一次
loop
【在 w*********e 的大作中提到】 : 如题,在做一个筛选,需要从大量数据中找到一些outlier,用matlab写了一个for loop : ,每次把找到的sample写进一个vector,有没有比较方便的函数?现在是先定义一个初 : 始变量为[],然后concatenate一下,总感觉效率不高,速度太慢。。。。
|
c***n 发帖数: 223 | 3 1. 用matlab尽量避开for loop
2. 能事先知道结果的大小,最好先分配内存。动态分配内存特别慢,尤其是后来数组
大了之后。
3. 可以把找到的sample的index写进vector,而不是数据本身。
% find values that are larger than 0.8 from a 10000x1 vector of Gaussian %
random numbers
fakeData = randn(10000, 1);
collectedIdx = [];
for idx = 1:numel(fakeData)
if fakeData(idx) > 0.8
collectedIdx = [collectedIdx, idx];
end
end
collectedData = fakeData(collectedIdx);
当然最快的方法是用slicing,一行搞定:
collectedData = fakeData(fakeData>0.8);
loop
【在 w*********e 的大作中提到】 : 如题,在做一个筛选,需要从大量数据中找到一些outlier,用matlab写了一个for loop : ,每次把找到的sample写进一个vector,有没有比较方便的函数?现在是先定义一个初 : 始变量为[],然后concatenate一下,总感觉效率不高,速度太慢。。。。
|
e*********6 发帖数: 3453 | 4 额。。。
不过一般自带的都比自己写的快
【在 c***n 的大作中提到】 : 1. 用matlab尽量避开for loop : 2. 能事先知道结果的大小,最好先分配内存。动态分配内存特别慢,尤其是后来数组 : 大了之后。 : 3. 可以把找到的sample的index写进vector,而不是数据本身。 : % find values that are larger than 0.8 from a 10000x1 vector of Gaussian % : random numbers : fakeData = randn(10000, 1); : collectedIdx = []; : for idx = 1:numel(fakeData) : if fakeData(idx) > 0.8
|
s******s 发帖数: 13035 | 5 不用matlab。不过outlier比较多的话,这种append操作很慢的。
一般是给个大数组,填满了就扩一倍继续
loop
【在 w*********e 的大作中提到】 : 如题,在做一个筛选,需要从大量数据中找到一些outlier,用matlab写了一个for loop : ,每次把找到的sample写进一个vector,有没有比较方便的函数?现在是先定义一个初 : 始变量为[],然后concatenate一下,总感觉效率不高,速度太慢。。。。
|
e*********6 发帖数: 3453 | 6 我只想知道这里的vector是个啥东西,是linked list还是array
【在 s******s 的大作中提到】 : 不用matlab。不过outlier比较多的话,这种append操作很慢的。 : 一般是给个大数组,填满了就扩一倍继续 : : loop
|
g********6 发帖数: 86 | 7 Lz你贴几行数据来看看,感觉大家都跃跃欲试了哈哈。感觉应该可以避开for loop.如
果是R的话应该可以用apply函数.在Perl里可以逐行loop文件直接print outlier,极其
经济
loop
【在 w*********e 的大作中提到】 : 如题,在做一个筛选,需要从大量数据中找到一些outlier,用matlab写了一个for loop : ,每次把找到的sample写进一个vector,有没有比较方便的函数?现在是先定义一个初 : 始变量为[],然后concatenate一下,总感觉效率不高,速度太慢。。。。
|
n******7 发帖数: 12463 | 8 R里面为了performance用apply避开for loop是个普遍的误解
参看
http://stackoverflow.com/questions/2275896/is-rs-apply-family-m
http://stackoverflow.com/questions/7142767/why-are-loops-slow-i
特别的:(Do not avoid loops simply for the sake of avoiding loops)
It's not always the case that loops are slow and apply is fast. There's a
nice discussion of this in the May, 2008, issue of R News:
Uwe Ligges and John Fox. R Help Desk: How can I avoid this loop or make it
faster? R News, 8(1):46-50, May 2008.
In the section "Loops!" (starting on pg 48), they say:
Many comments about R state that using loops is a particularly bad idea.
This is not necessarily true. In certain cases, it is difficult to write
vectorized code, or vectorized code may consume a huge amount of memory.
They further suggest:
Initialize new objects to full length before the loop, rather than
increasing their size within the loop.
Do not do things in a loop that can be done outside the loop.
Do not avoid loops simply for the sake of avoiding loops.
【在 g********6 的大作中提到】 : Lz你贴几行数据来看看,感觉大家都跃跃欲试了哈哈。感觉应该可以避开for loop.如 : 果是R的话应该可以用apply函数.在Perl里可以逐行loop文件直接print outlier,极其 : 经济 : : loop
|
s******s 发帖数: 13035 | 9 Well. Avoid loop 在r里面不仅是效率,更是style. 当然确实有时候用Loop更简便一点
【在 n******7 的大作中提到】 : R里面为了performance用apply避开for loop是个普遍的误解 : 参看 : http://stackoverflow.com/questions/2275896/is-rs-apply-family-m : http://stackoverflow.com/questions/7142767/why-are-loops-slow-i : 特别的:(Do not avoid loops simply for the sake of avoiding loops) : It's not always the case that loops are slow and apply is fast. There's a : nice discussion of this in the May, 2008, issue of R News: : Uwe Ligges and John Fox. R Help Desk: How can I avoid this loop or make it : faster? R News, 8(1):46-50, May 2008. : In the section "Loops!" (starting on pg 48), they say:
|
n******7 发帖数: 12463 | 10 我说了为了performance用apply意义不大
lz遇到的不就是performance问题吗
另外我感觉lz短时间用不好apply,也没必要
allSamples[is.outlier(allSamples)]就OK了
一点
【在 s******s 的大作中提到】 : Well. Avoid loop 在r里面不仅是效率,更是style. 当然确实有时候用Loop更简便一点
|
f*******9 发帖数: 74 | 11 你这个问题简单得很,根本就不是loop的问题,就是一个逻辑索引的技巧而已,如3楼
所指,newVector = data(indexOfOutliers)。建议你好好学习一下Matlab的帮助文档。
话说回来,Matlab的向量化(vectorized)操作效率很高,比C的for循环还要快。而在
Matlab里面用for循环的话是最慢的。R和Matlab相似。 |
K****n 发帖数: 5970 | 12 太牛了
档。
【在 f*******9 的大作中提到】 : 你这个问题简单得很,根本就不是loop的问题,就是一个逻辑索引的技巧而已,如3楼 : 所指,newVector = data(indexOfOutliers)。建议你好好学习一下Matlab的帮助文档。 : 话说回来,Matlab的向量化(vectorized)操作效率很高,比C的for循环还要快。而在 : Matlab里面用for循环的话是最慢的。R和Matlab相似。
|
t*****z 发帖数: 1598 | 13 学习了
[发表自未名空间手机版 - m.mitbbs.com] |