在 Matlab 中,我有一个大矩阵(512x512x100)。为了分析它,我使用了blockproc。由于blockproc只接受2D矩阵,我使用 mat2cell 和其他一些后续步骤将我的原始矩阵转换为2D矩阵。 blockproc函数搜索每个子矩阵中具有最高值的像素,并返回参考该子矩阵的坐标。
经过几个步骤后,我得到了第一个 mat2cell 转换参考的最大像素的坐标。现在我想将这些坐标转换为全局坐标,即大型原始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 后,我得到了:
cell(:,:,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子基数中的最大像素值(第一个"子单元")
我想这是将这些相对坐标转换为全局的非常简单的方法,但我不知道如何。提前谢谢。
答案 0 :(得分: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 :(得分: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);