[討論] 3D點層轉成座標(有暴力解,求加速)已回收

看板MATLAB作者 (覺悟者恆幸福)時間13年前 (2011/06/19 05:04), 編輯推噓1(103)
留言4則, 3人參與, 最新討論串1/1
問題是這樣的:現在有個3D圖形,它是用一層一層的剖面圖來表示的 例如在3x3x3空間裡的一顆中空小球長這樣: A= cat(3, [0 0 0; 0 1 0; 0 0 0],[0 1 0; 1 0 1; 0 1 0],[0 0 0; 0 1 0; 0 0 0]); 也就是它第一層 0 0 0 第二層 0 1 0 第三層 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 而我要將它轉成一般的座標點表示,即 B = 1 2 2 2 1 2 2 2 1 2 2 3 2 3 2 3 2 2 (x,y,z) 現在我用最直覺的方式...三層for迴圈開下去跑(如下).... 想當然,在大圖的狀況下跑的非~常~慢 請問有沒有聰明一點的方法來改進這個笨方法? 或者其實有函數在做這件事? [h w z] = size(A); num = size(find(A),1); B = zeros(num,3,'uint16'); num = 1; for i = 1:h for j = 1:w for k = 1:z if(A(i,j,k) == 1) B(num,:) = [i j k]; num = num+1; end end end end 另外如果這個3D圖形只有"一層" (Z方向上一次只有一點為1)能不能再進一步加速? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.116.164.236

06/19 13:47, , 1F
[row, col]=find(x) 有沒有可能沿著 Z 方向一層一層把
06/19 13:47, 1F

06/19 13:47, , 2F
x, y 座標抓出來
06/19 13:47, 2F

06/19 14:19, , 3F
[r c p]=ind2sub([3 3 3],find(A==1))
06/19 14:19, 3F

06/19 20:23, , 4F
樓上太感謝了!in2sub正解! 一樓也多蝦 提出一種想法~
06/19 20:23, 4F
文章代碼(AID): #1D_HBsWK (MATLAB)