→ 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)
推 DIDIMIN:謝謝你 09/07 19:29
推 Feis:謝謝! 這蠻有趣的. 另外請教一下, Matlab 內建的比較慢是有 09/07 23:22
→ Feis:什麼語法特性還是說他內建的比較泛用? 謝謝 : ) 09/07 23:22
→ Feis:抱歉, 我不是很懂 Matlab 的哲學. 我會自己去查一下 09/07 23:23
推 bridge23:= [1:n]'; 09/09 09:17