※ 引述《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