2014-01-24 70 views
0

坐标在Matlab的我有一个大的矩阵(512x512x100)。为了分析它,我使用了blockproc。由于该blockproc只接受二维矩阵其实我已经改变了我原来的矩阵为使用二维矩阵mat2cell和其他一些后续步骤。 blockproc函数在每个子矩阵中搜索具有最高值的像素,并返回其参考该子矩阵的坐标。变换相对单元格的坐标,以绝对的矩阵在Matlab

经过几个步骤后,我已经获得了第一个参考第一个变换的最大像素的坐标。现在我想将这些坐标转换为全局坐标,即大原始3D矩阵中的绝对坐标。

我已经尝试一些东西与这个例子:

d =兰特(4,4,4)

d(:,:,1)=

0.0451 0.8044 0.0784 0.7859 
0.8911 0.3481 0.4636 0.9806 
0.4887 0.5677 0.0999 0.9488 
0.7822 0.0467 0.5569 0.2256 

d( :,:,2)=

0.8131 0.8880 0.8066 0.8103 
0.8240 0.3358 0.8422 0.2552 
0.8364 0.2759 0.3753 0.7741 
0.9853 0.8297 0.3745 0.5936 

d(:,:,3)=

0.1200 0.1841 0.3897 0.0894 
0.0747 0.7485 0.4866 0.4722 
0.8387 0.9523 0.0166 0.5013 
0.8210 0.3107 0.6935 0.1286 

d(:,:,4):

细胞=

0.6424 0.7322 0.4631 0.1684 
0.5523 0.0953 0.0168 0.6231 
0.1073 0.5530 0.8504 0.9304 
0.3482 0.7804 0.7657 0.2496 

mat2cell我有后(:,:,1)=

[2x2x2 double] [2x2x2 double] 
[2x2x2 double] [2x2x2 double] 

cell(:,:,2)=

[2x2x2 double] [2x2x2 double] 
[2x2x2 double] [2x2x2 double] 

这些是由此产生的坐标。从下面的矩阵的每一行表示最大像素的每个“子电池”的坐标:通过执行

max_px =

2  1 
2  3 
2  2 
1  2 
2  2 
1  2 
2  4 
1  4 

“小区{1}(2,1)”你:

ANS =

0.8911 

至极是最大像素的在第一3D子batrix(第一 “子电池”)的值

我想这是将这些相对坐标转换为全局的非常直接的方式,但我不知道如何。先谢谢你。

+0

我想我已经在[您的上一个问题](http://stackoverflow.com/q/21305443/2586922)中回答了。在我的回答中使用块的'.location'字段 –

+0

再次感谢你,路易斯。我已经使用了你在我以前的问题中告诉我的。结果就是上面例子的坐标矩阵。我的新问题是如何改变这些局部坐标。 – karl71

回答

2

你真的没有使用blockproc。我不知道为什么没有人不...

dcell=mat2cell(d,...); 

    mask=cell2mat( cellfun(@(c) eq(c,max(c(:))) , dcell, 'uni',0)) ; 

    [imax,jmax,kmax]=ind2sub(size(d), find(mask(:))); 

这假定有每个子阵列,你似乎也假设在一个独特的最大值。

+1

我没有在每个子数组中查找最大值,而是查找其全局矩阵引用的坐标。 – karl71

+0

这就是我给你的。 –

+0

好的。第二行不运行。最后一行(第三个)将获得坐标。你是对的! – karl71

0

此使用您已有的max_px。第4行和第5行只是将max_px转换为更自然的3D坐标,所以也许可以省略这些坐标,并且缩短代码,如果能够以此形式开始的话。

dcell=mat2cell(d,...); 


[outer_dims{1:3}]=size(dcell); outer_dims=[outer_dims{:}], 
[inner_dims{1:3}]=size(dcell{1}); inner_dims=[inner_dims{:}], 

idx=sub2ind(inner_dims,max_px(:,1),max_px(:,2)); 

[ii,jj,kk]= ind2sub(inner_dims,idx); %get 3-inner max coodinates 


[X,Y,Z]=ndgrid(1:outer_dims(1),1:outer_dims(2), 1:outer_dims(3)); 

dims6=[inner_dims; outer_dims]; 

idx6=sub2ind(dims6(:).', ii,X(:),jj,Y(:),kk,Z(:)); 

[imax,jmax,kmax] = ind2sub(size(d),idx6);