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
为此目的而工作。谢谢