Re: [討論] 欲計算Hessian,應如何建立Cell Array?

作者: celestialgod (天)   2015-10-22 12:52:27
※ 引述《YoursEver (銀英傳出webgame!?)》之銘言:
: 如題,
: 要計算4D Hessian,
: 請問應如何將所有的偏微分項排入cell array?
: 以2D舉例,
: (1) H = [ partial_xx, partial_xy; partial_yx, partial_yy ];
: (2) 假設對一張 M-by-N 的影像做 Hessian,
: 這時候會得到 partial_xx, partial_xy; partial_yx, partial_yy 等,
: 共 4 個大小為 M-by_N 的矩陣.
: (3) 我希望建立一個 M-by-N 的 cell array,
: 每一個cell內含一個 2*2 的矩陣:
: [ partial_xx(i,j), partial_xy(i,j);
: partial_yx(i,j), partial_yy(i,j)]
: (i,j)對應到原本影像內的第(i,j)個pixel;
: ==
: 請問該怎麼寫才省時省力?
: 目前必須要排進cell array才能call cellfun處理後續.
: 雖然可以靠迴圈硬排,
: 因為實際的4D data量太大,迴圈會額外耗費時間.
: 謝謝.
我不知道你4D是什麼意思,以你2D為例:
M = 400;
N = 300;
partial_xx = rand(M, N);
partial_xy = rand(M, N);
partial_yx = rand(M, N);
partial_yy = rand(M, N);
tic
H = cat(3, partial_xx, partial_yx, partial_xy, partial_yy);
H = cellfun(@(x) reshape(squeeze(x), 2, 2), num2cell(H, 3), 'uni', false);
toc
% Elapsed time is 2.287873 seconds.
% note: 注意cat的順序,因為MATLAB是column-major,排的時候要排對
tic
H2 = arrayfun(@(x11, x12, x21, x22) [x11, x12; x21, x22], partial_xx, ...
partial_xy, partial_yx, partial_yy, 'uni', false);
toc
% Elapsed time is 1.355389 seconds.
isequal(H, H2) % true
作者: YoursEver (豬是妳)   2015-10-22 14:07:00
謝謝. 實際case是要看看某個f(x,y,u,v)的Hessian的特性光是想到還要每個voxel看eigenvalue就覺得很噁心.
作者: sunev (Veritas)   2015-10-22 16:23:00
num2cell也是跑迴圈....H3=squeeze(num2cell(permute(reshape(cat(3,partial_xx,partial_yx,partial_xy,partial_yy),[M N 2 2]),[3 4 1 2]),[1 2]))UniformOutput 是 false 時似乎很耗時R有比較快嗎?當然他是免費的....你的問題是卡在IO嗎?用linux內建的指令做一些前處理後再用matlab 讀?用matlab 就叫跨平台? 那不就表示三個OS版本都要買....話說windows也是有MSYS可用MAC現在的OSX也都有常用的linux shell script指令吧?正想說你有沒有用到mex編譯,這方面相容性不好弄......就你的情形我猜簡單的grep cut tr組合就可以了印象中mex是編譯時的環境有點龜毛,編譯後的檔案倒是沒這麼麻煩,只是一樣三平台都要分開編譯就是了所以你要抓的是 character 後面的number嗎?

Links booklink

Contact Us: admin [ a t ] ucptt.com