Matlab 使用线性索引提取3D矩阵切片的相同部分

Matlab 使用线性索引提取3D矩阵切片的相同部分,matlab,matrix,indexing,Matlab,Matrix,Indexing,事实上,我的问题是我之前问题的延续: 多亏了丹和他的想法,这一目标才得以实现 我的新问题是: 如果我有一个3D矩阵,8乘8乘12,例如a=randn(8,8,12) 让我们看看第一个切片的线性索引: 从丹的解决方案中,我了解到A[4:6,4:6,:]可以提取所有切片的相应部分 然而,回到我的实际情况,通过实际计算行和列来提取部分似乎不适合我的目的,因为我的矩阵大小很大,而且我有很多子矩阵要提取 所以,我更喜欢研究线性索引,我想问一下,是否有任何方法可以处理这种可能性 这是我的审判: 通过定

事实上,我的问题是我之前问题的延续:

多亏了丹和他的想法,这一目标才得以实现


我的新问题是:

如果我有一个3D矩阵,8乘8乘12,例如
a=randn(8,8,12)

让我们看看第一个切片的线性索引:

从丹的解决方案中,我了解到
A[4:6,4:6,:]
可以提取所有切片的相应部分

然而,回到我的实际情况,通过实际计算行和列来提取部分似乎不适合我的目的,因为我的矩阵大小很大,而且我有很多子矩阵要提取

所以,我更喜欢研究线性索引,我想问一下,是否有任何方法可以处理这种可能性

这是我的审判:

通过定义
sub_group=[28 29 30 36 37 38 44 45 46]
,那么
A(sub_group)
可以从三维矩阵的第一个切片
A
中提取子矩阵

我知道
A(子组+8*8*(n-1))
可以从
n
切片中提取子矩阵

我的目标是只处理我的
子组
,然后提取每个切片的相同部分

最重要的是,我必须在更新子矩阵的值后将其放回原处

那么,对于我来说,matlab有什么快速语法可以使用吗

感谢您的帮助。

方法#1

对于这种情况,当您需要计算线性指数时,可以使用如下所示-

%// Store number of rows in A as a variable
M = size(A,1)

%// Get start and offset linear indices for the first slice and thus sub_group
start_idx = (colstart-1)*M + rowstart
offset_idx = bsxfun(@plus,[0:rowstop - rowstart]', [0:colstop-colstart]*M) %//'
sub_group = reshape(start_idx + offset_idx,1,[])

%// Calculate sub_groups for all 3D slices
all_sub_groups = bsxfun(@plus,sub_group',[0:size(A,3)-1]*numel(A(:,:,1)))
样本运行-

A(:,:,1) =
     0.096594      0.52368      0.76285      0.83984      0.27019
      0.84588      0.65035      0.57569      0.42683       0.4008
       0.9094      0.38515      0.63192      0.63162      0.55425
     0.011341       0.6493       0.2782      0.83347      0.44387
A(:,:,2) =
     0.090384     0.037262      0.38325      0.89456      0.89451
      0.74438       0.9758      0.88445      0.39852      0.21417
     0.032615      0.52234      0.25502      0.62502    0.0038592
      0.42974      0.90963      0.90905       0.5676      0.88058
rowstart =
     2
rowstop =
     4
colstart =
     3
colstop =
     5
sub_group =
    10    11    12    14    15    16    18    19    20
all_sub_groups =
    10    30
    11    31
    12    32
    14    34
    15    35
    16    36
    18    38
    19    39
    20    40
方法#2

对于基于语法的快速解决方案,可以在此处提出建议。实现看起来像这样-

[X,Y] = ndgrid(rowstart:rowstop,colstart:colstop);
sub_group = sub2ind(size(A(:,:,1)),X,Y);

[X,Y,Z] = ndgrid(rowstart:rowstop,colstart:colstop,1:size(A,3));
all_sub_groups = sub2ind(size(A),X,Y,Z);

感谢您提供两个版本的解决方案
bsxfun
sub2ind
为此目的而工作。谢谢