作者mp19990920 (郝渴连)
看板MATLAB
标题Re: [讨论] 如何更有效率?
时间Sat Sep 7 14:16:54 2013
※ 引述《DIDIMIN ( )》之铭言:
: 已知有一行向量 X = [a, b, c, d]'
: 想要生成
: Y = [ a, 0, 0, 0 ]
: [ b, a, 0, 0 ]
: [ c, b, a, 0 ]
: [ d, c, b, a ] 4x4 矩阵
: 目前的写法
: tic
: X = [1:n]';
: i = 1; Y = zeros(numel(X),numel(X));
: while i <= numel(X)
: Y(:,i) = [zeros(i-1,1);X(1:numel(X)+1-i,1)];
: i = i+1;
: end
: toc
: 当 n 为 1000 时,计算时间为 0.008490 秒
: 当 n 为 5000 时,计算时间为 0.147806 秒
: 当 n 为 10000 时,计算时间为 0.462627 秒
: 当 n 为 20000 时,计算时间为 1.777377 秒
: 电脑配备:i7-2600 3.4GHz、RAM 8G、Windows 8、Matlab R2013a
: 请问各位大大有没有更有效率的写法?
法一:去除你原本code中多余的运算
(1)numel多余
(2)i=i+1多余(但影响极小)
(3)没必要重设整个column
X = [1:n]';
Y = eye(n);
for i = 2:n
Y(i:n, i) = i:n;
end
p.s. 在我的电脑中n=1000跑1000次平均时间
原本: 0.06610 sec
加速: 0.02339 sec
你的电脑可真快呢!!!
法二:用mex来改写
难度高,debug麻烦,不太建议
法三:重新检视你的演算法
产生这个矩阵很没意义,
且用n^2的储存空间来表示n个资讯非常的不经济
--
哀愁犹如雪花梢然飘落,
白雪厚积,
终究成了孤独的小结晶,
谁能融化我冰冻已久的孤寂?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 111.67.52.211
1F:→ Feis:我可以请教一下为什麽内建的 toeplitz() 慢很多 Q_Q 09/07 17:11
function t = toeplitz(c,r)
[step 0] 初始化
r = r(:); % force column structure
p = length(r);
m = length(c);
[step 1] 产生出待放元素表
x = [r(p:-1:2) ; c(:)]; % build vector of user data
[step 2] 产生出拿取待放元素时要用的idx
xclass = class(x);
cidx = (zeros(xclass):m-1)';
ridx = p:-1:ones(xclass);
t = cidx(:,ones(p,1)) + ridx(ones(m,1),:); % Toeplitz subscripts
[step 3] 把元素从从元素表中拿出来
t(:) = x(t); % actual data
step 2 中
(1) 用 x(:, [1 1 1 ... l]) 的方式来复制 vector 比较慢
(2) 记忆体需产生两个大小跟结果相同的矩阵後再做加总的动作
记忆体需要做2次额外的配置与释放,而且还要做 O(N^2) 的运算
step 3 可用我上面的方式来避掉
※ 编辑: mp19990920 来自: 111.67.52.211 (09/07 18:41)
若你对效能有疑虑的话,
可以使用 matlab 内建的工具 "Profiler",
快速按钮就放在 help 的左边,
超超超好用的!!!
※ 编辑: mp19990920 来自: 111.67.52.211 (09/07 18:45)
※ 编辑: mp19990920 来自: 111.67.52.211 (09/07 18:47)
2F:推 DIDIMIN:谢谢你 09/07 19:29
3F:推 Feis:谢谢! 这蛮有趣的. 另外请教一下, Matlab 内建的比较慢是有 09/07 23:22
4F:→ Feis:什麽语法特性还是说他内建的比较泛用? 谢谢 : ) 09/07 23:22
5F:→ Feis:抱歉, 我不是很懂 Matlab 的哲学. 我会自己去查一下 09/07 23:23
6F:推 bridge23:= [1:n]'; 09/09 09:17