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