- 积分
- 57
- 注册时间
- 2006-1-10
- 仿真币
-
- 最后登录
- 1970-1-1
|
发表于 2014-9-24 11:34:56
|
显示全部楼层
来自 北京
终于找到比较通用的向量化方法了,还是利用强大的bsxfun函数。
foo函数如下
- function C = foo(A,~)
- C = false(size(A,1),1);
- ind = find(A,1,'first');
- C(ind) = true;
复制代码
效率比较如下:
- clear;
- a = randi([0,10],8000,5000);
- tic;
- nz1 = zeros(8000,1);
- for k = 1:8000
- [~,~,nz1(k)] = find(a(k,:),1,'first');
- end
- toc;
- tic;
- [~,c,v] = find(a');
- nz2 = v(diff([0;c])~=0);
- toc;
- tic;
- [~, tmpInd] = max(logical(a'));
- nz3 = a((sub2ind([8000, 5000], 1:8000, tmpInd))');
- toc;
- tic;a = a';ind = bsxfun(@foo,a,zeros(1,size(a,2)));
- nz4 = a(ind);
- toc;
- isequal(nz1, nz2, nz3,nz4)
- 时间已过 0.867728 秒。
- 时间已过 1.196446 秒。
- 时间已过 0.390155 秒。
- 时间已过 0.408648 秒。
- ans =
- 1
复制代码
遇到类似的问题,修改bsxfun中的foo函数就行。 |
评分
-
1
查看全部评分
-
|