- 积分
- 30
- 注册时间
- 2004-11-17
- 仿真币
-
- 最后登录
- 1970-1-1
|
发表于 2008-6-9 03:49:49
|
显示全部楼层
来自 上海
这个问题,基本上,很难……
给你解决一下,让你体验一下什么叫矢量化。
首先的问题是:在你的代码后面增加分号,显示也是需要花时间的。
其次才是矢量化。
第一步,调试的时候,不要用这么大的矩阵来搞……
n=30;
a=rand(n,n);
tic;
b=sparse(3*n,3*n);
for i=1:n;
for j=1:n;
b(3*i-2,3*j-2)=a(i,j);
end
end
toc
Elapsed time is 0.012402 seconds.
这个就是使用两个循环计算的时间。后面矢量化,先来了一个简单的:
tic;
c=zeros(3*n,3*n);
%b=sparse(3*n,3*n);
[am,an]=meshgrid(1:n,1:n);
[cm,cn]=meshgrid(1:3:3*n,1:3:3*n);
c(cm(:),cn(:))=a(am(:),an(:));
toc
Elapsed time is 0.116084 seconds.
判断一下结果是否正确:
>>isequal(c,b)
ans =
1
但是矢量化以后,花费的时间反而长了很多……
所以事情都是有原因的,原因就在于,重新对稀疏矩阵赋值的时候,实际上还是需要查找的,所以结果是很慢的。
改一下就可以了,直接使用a来创建稀疏矩阵:
tic;
[dm,dn]=meshgrid(1:3:3*n,1:3:3*n);
d=sparse(dm(:),dn(:),a(:),3*n,3*n).';
toc
Elapsed time is 0.003139 seconds.
>> isequal(d,b)
ans =
1
这下快多了!
恭喜!
最后来玩玩你这个300*300的大矩阵:
n=300;
a=rand(n,n);
tic;
[dm,dn]=meshgrid(1:3:3*n,1:3:3*n);
d=sparse(dm(:),dn(:),a(:),3*n,3*n).';
toc
Elapsed time is 0.040848 seconds.
[ 本帖最后由 bainhome 于 2008-6-9 03:58 编辑 ] |
评分
-
1
查看全部评分
-
|