Matlab 使用二维索引和一维向量访问三维矩阵

Matlab 使用二维索引和一维向量访问三维矩阵,matlab,multidimensional-array,indexing,Matlab,Multidimensional Array,Indexing,我有一个3D矩阵a(大小m*n*k),其中m=纬度,n*经度,k=时间。 我只需要逻辑矩阵B(size m*n)指定的第一维度和第二维度的特定值,我只需要向量C(size k)指定的时间步长 最后,这应该成为一个2D矩阵D,因为前两个维度将变为一个 最简单的方法是什么? 这里也可以把逻辑和线性结合起来吗?例如,B是逻辑的,C是线性的 带有rand的示例代码: A=rand(10,10,10); B=randi([0 1], 10,10); C=randi([0 1], 10,1); D=A(B,

我有一个3D矩阵
a
(大小m*n*k
),其中m=纬度,n*经度,k=时间。 我只需要逻辑矩阵
B
size m*n
)指定的第一维度和第二维度的特定值,我只需要向量
C
size k
)指定的时间步长

最后,这应该成为一个2D矩阵D,因为前两个维度将变为一个

最简单的方法是什么? 这里也可以把逻辑和线性结合起来吗?例如,B是逻辑的,C是线性的

带有rand的示例代码:

A=rand(10,10,10);
B=randi([0 1], 10,10);
C=randi([0 1], 10,1);
D=A(B,C) %This would be my approach which doesnt work. The size of D should be sum(B)*sum(c)
另一个没有兰德的例子:

A=reshape([1:27],3,3,3);
B=logical([1,0,0;1,0,0;0,0,0]);
C=(1,3); %get data from timestep 1 and 5

D=A(B,C);%What I want to do, but doesnÄt work that way

D=[1,19;2,20];%Result should look like this! First dimension is now all data from dimesion 1 and 2. New dimesion 2 is now the time.
然后使用
bsxfun
或隐式扩展
*
(如果是较新的Matlab版本),为给定坐标生成逻辑矩阵

>> idx = logical(bsxfun(@times,B,C))

idx(:,:,1) =
     0     0     0     0
     0     0     0     0
     0     0     0     0
     0     0     0     0  
idx(:,:,2) =
     1     1     0     1
     1     0     1     1
     0     0     1     0
     1     0     1     1    
idx(:,:,3) =
     1     1     0     1
     1     0     1     1
     0     0     1     0
     1     0     1     1    
idx(:,:,4) =
     0     0     0     0
     0     0     0     0
     0     0     0     0
     0     0     0     0
然后您的输出是
D=A(idx)
。但是,请注意,这个
D
现在是一个Nx1数组。其中,N是真元素数,是C中真元素数的B倍。B中为真元素数的10倍,C中为真元素数的2倍:

>> size(D)

ans =

    20     1

一种简单的方法是首先将
A
转换成
m*n
-by-
k
矩阵,然后执行以下操作:

在这种情况下,
C
可以是逻辑向量或索引向量

>> size(D)

ans =

    20     1
result = reshape(A, [], size(A, 3));
result = result(B, C);