Matlab 使用二维索引和一维向量访问三维矩阵
我有一个3D矩阵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,
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);