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

看板MATLAB作者 (天)時間9年前 (2015/10/22 12:52), 9年前編輯推噓10(1008)
留言18則, 2人參與, 最新討論串2/3 (看更多)
※ 引述《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://www.ptt.cc/bbs/MATLAB/M.1445489551.A.8B0.html ※ 編輯: celestialgod (140.109.73.190), 10/22/2015 13:45:08

10/22 14:07, , 1F
謝謝. 實際case是要看看某個f(x,y,u,v)的Hessian的特性
10/22 14:07, 1F

10/22 14:14, , 2F
光是想到還要每個voxel看eigenvalue就覺得很噁心.
10/22 14:14, 2F
我也要做一個很複雜的東西 也是四個維度要看eigen vector....更可怕~"~ 偷偷GOOGLE你的IP 是我斜對面的所 - 資訊所的吧? 有機會可以認識一下XDD 你的有點像是聽起來像是fMRI資料... 腦袋+時間 四維了

10/22 16:23, , 3F
num2cell也是跑迴圈....
10/22 16:23, 3F

10/22 16:28, , 4F
H3=squeeze(num2cell(permute(reshape(cat(3,partial_xx,
10/22 16:28, 4F

10/22 16:28, , 5F
partial_yx,partial_xy,partial_yy),[M N 2 2]),[3 4 1 2])
10/22 16:28, 5F

10/22 16:28, , 6F
,[1 2]))
10/22 16:28, 6F

10/22 16:50, , 7F
UniformOutput 是 false 時似乎很耗時
10/22 16:50, 7F
恩阿,唉,最近越來越不滿意MATLAB,可是他現在是主要工具,我好想換R....XDD 最近遇到讀進來的資料是chracter跟numeric參雜的資料 我也不可能手動去做identification的動作,只能用慢慢的readtable做 然後table的varfun根本就是迴圈,很慢慢慢慢的迴圈~~~

10/22 17:25, , 8F
R有比較快嗎?當然他是免費的....
10/22 17:25, 8F

10/22 17:25, , 9F
你的問題是卡在IO嗎?
10/22 17:25, 9F
恩,主要是IO吧QQ,進來之後都可以用struct來做 我IO後來改成自己硬幹之後 有好一點 不過還是沒辦法47MB在很快時間讀完 不過在處理字串上MATLAB還是慢的誇張 regexp(cell_of_strings, 'some format', 'tokens') 要有點久= =

10/22 23:44, , 10F
用linux內建的指令做一些前處理後再用matlab 讀?
10/22 23:44, 10F
因為老師要從windows到linux, mac都要能用,我連c++都不敢寫...... 所以更不用說sh了XDD 乖乖用MATLAB做IO 其實能用其他工具 我就用R幹了= =... 何必還去用SH怎麼處理資料

10/23 00:11, , 11F
用matlab 就叫跨平台? 那不就表示三個OS版本都要買....
10/23 00:11, 11F
我們老師就是要確定在三個平台的matlab都能跑 這樣說比較合理XD 中研院有錢阿 都有買= = 老師自己用MAC 之後跑模擬用linux 我自己測試用windows XDD 我是可以去用linux 可是MAC也不能去做sh= =

10/23 00:13, , 12F
話說windows也是有MSYS可用
10/23 00:13, 12F
就這樣吧 我正在說服我們老師改用R XDD 他用R 我用Rcpp 系統是什麼應該都沒關係了(攤手 MEX編譯有時候跨個平台都會出事(嘆氣 還要MATLAB版本要比較舊....一堆麻煩事

10/23 00:17, , 13F
MAC現在的OSX也都有常用的linux shell script指令吧?
10/23 00:17, 13F
嗚嗚嗚嗚 你不要把我推向一個大坑

10/23 00:23, , 14F
正想說你有沒有用到mex編譯,這方面相容性不好弄......
10/23 00:23, 14F
我自己在MATLAB 2015b編了一個MEX 丟去2014b就不能用了 我只能在安裝一個2014b編譯

10/23 00:25, , 15F
就你的情形我猜簡單的grep cut tr組合就可以了
10/23 00:25, 15F
我的東西大概長這樣: select, varName1, varName2, ..., varName56 from XXX where YYYZZZ.... go ,character, number, number, number, ... ....(重複上一行格式大概有287列) 接著,再重複上面的那四行大概100~300次(depends) 是一個檔案 共有400個這樣的檔案要處理,我不確定要怎樣用SH做

10/23 00:39, , 16F
印象中mex是編譯時的環境有點龜毛,編譯後的檔案倒是沒這麼
10/23 00:39, 16F

10/23 00:39, , 17F
麻煩,只是一樣三平台都要分開編譯就是了
10/23 00:39, 17F

10/23 00:44, , 18F
所以你要抓的是 character 後面的number嗎?
10/23 00:44, 18F
都要抓,所以很麻煩,如果只抓後面用csvread直接解決 對了,有時候,會不一樣多,所以若直接用,做切割 切出來會不一樣長還要排除這種情況 我現在做法是直接全部讀進來 有包含select, go都刪掉 然後用strsplit去切每一列,去掉長度0的cell跟過長的 最後把數字部分變成矩陣,剩下character用成cell 然後在製作對應表把character轉成數字 並到矩陣去 最後把對應表跟character部分都存下來 ※ 編輯: celestialgod (180.218.154.163), 10/23/2015 00:55:38
文章代碼(AID): #1MA6kFYm (MATLAB)
文章代碼(AID): #1MA6kFYm (MATLAB)