作者celestialgod (天)
看板MATLAB
标题Re: [讨论] 欲计算Hessian,应如何建立Cell Array?
时间Thu Oct 22 12:52:27 2015
※ 引述《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
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.109.73.190
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/MATLAB/M.1445489551.A.8B0.html
※ 编辑: celestialgod (140.109.73.190), 10/22/2015 13:45:08
1F:推 YoursEver: 谢谢. 实际case是要看看某个f(x,y,u,v)的Hessian的特性 10/22 14:07
2F:→ YoursEver: 光是想到还要每个voxel看eigenvalue就觉得很恶心. 10/22 14:14
我也要做一个很复杂的东西 也是四个维度要看eigen vector....更可怕~"~
偷偷GOOGLE你的IP 是我斜对面的所 - 资讯所的吧? 有机会可以认识一下XDD
你的有点像是听起来像是fMRI资料... 脑袋+时间 四维了
3F:→ sunev: num2cell也是跑回圈.... 10/22 16:23
4F:推 sunev: H3=squeeze(num2cell(permute(reshape(cat(3,partial_xx, 10/22 16:28
5F:→ sunev: partial_yx,partial_xy,partial_yy),[M N 2 2]),[3 4 1 2]) 10/22 16:28
6F:→ sunev: ,[1 2])) 10/22 16:28
7F:推 sunev: UniformOutput 是 false 时似乎很耗时 10/22 16:50
恩阿,唉,最近越来越不满意MATLAB,可是他现在是主要工具,我好想换R....XDD
最近遇到读进来的资料是chracter跟numeric参杂的资料
我也不可能手动去做identification的动作,只能用慢慢的readtable做
然後table的varfun根本就是回圈,很慢慢慢慢的回圈~~~
8F:推 sunev: R有比较快吗?当然他是免费的.... 10/22 17:25
9F:→ sunev: 你的问题是卡在IO吗? 10/22 17:25
恩,主要是IO吧QQ,进来之後都可以用struct来做
我IO後来改成自己硬干之後 有好一点 不过还是没办法47MB在很快时间读完
不过在处理字串上MATLAB还是慢的夸张
regexp(cell_of_strings, 'some format', 'tokens') 要有点久= =
10F:推 sunev: 用linux内建的指令做一些前处理後再用matlab 读? 10/22 23:44
因为老师要从windows到linux, mac都要能用,我连c++都不敢写......
所以更不用说sh了XDD 乖乖用MATLAB做IO
其实能用其他工具 我就用R干了= =... 何必还去用SH怎麽处理资料
11F:推 sunev: 用matlab 就叫跨平台? 那不就表示三个OS版本都要买.... 10/23 00:11
我们老师就是要确定在三个平台的matlab都能跑 这样说比较合理XD
中研院有钱阿 都有买= = 老师自己用MAC 之後跑模拟用linux
我自己测试用windows XDD 我是可以去用linux 可是MAC也不能去做sh= =
12F:→ sunev: 话说windows也是有MSYS可用 10/23 00:13
就这样吧 我正在说服我们老师改用R XDD
他用R 我用Rcpp 系统是什麽应该都没关系了(摊手
MEX编译有时候跨个平台都会出事(叹气 还要MATLAB版本要比较旧....一堆麻烦事
13F:推 sunev: MAC现在的OSX也都有常用的linux shell script指令吧? 10/23 00:17
呜呜呜呜 你不要把我推向一个大坑
14F:推 sunev: 正想说你有没有用到mex编译,这方面相容性不好弄...... 10/23 00:23
我自己在MATLAB 2015b编了一个MEX 丢去2014b就不能用了 我只能在安装一个2014b编译
15F:→ sunev: 就你的情形我猜简单的grep cut tr组合就可以了 10/23 00:25
我的东西大概长这样:
select, varName1, varName2, ..., varName56 from XXX where YYYZZZ....
go
,character, number, number, number, ...
....(重复上一行格式大概有287列)
接着,再重复上面的那四行大概100~300次(depends) 是一个档案
共有400个这样的档案要处理,我不确定要怎样用SH做
16F:推 sunev: 印象中mex是编译时的环境有点龟毛,编译後的档案倒是没这麽 10/23 00:39
17F:→ sunev: 麻烦,只是一样三平台都要分开编译就是了 10/23 00:39
18F:推 sunev: 所以你要抓的是 character 後面的number吗? 10/23 00:44
都要抓,所以很麻烦,如果只抓後面用csvread直接解决
对了,有时候,会不一样多,所以若直接用,做切割
切出来会不一样长还要排除这种情况
我现在做法是直接全部读进来
有包含select, go都删掉
然後用strsplit去切每一列,去掉长度0的cell跟过长的
最後把数字部分变成矩阵,剩下character用成cell
然後在制作对应表把character转成数字 并到矩阵去
最後把对应表跟character部分都存下来
※ 编辑: celestialgod (180.218.154.163), 10/23/2015 00:55:38