使用2D索引和1D向量访问3D矩阵

问题描述 投票:1回答:2

我有一个3D矩阵A (size m*n*k)其中m =纬度,n *经度和k =时间。我只想要第一维和第二维的特定值,由逻辑矩阵Bsize m*n)指定,我只想要矢量Csize 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)

另一个没有rand的例子:

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.
matlab multidimensional-array indexing
2个回答
2
投票
A = rand(4,4,4);
B = randi([0 1], 4,4)
B =
     1     1     0     1
     1     0     1     1
     0     0     1     0
     1     0     1     1

>> C = randi([0 1],1,1,4);
>> C(:)
ans =
     0
     1
     1
     0

然后使用bsxfun或隐式扩展扩展whith .*如果更新的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是真实元素的数量是B乘以C中真实元素的数量.10倍真实B和2倍真实C:

>> size(D)

ans =

    20     1

1
投票

一个简单的方法是首先将qazxsw poi qazxsw poi变成qazxsw poi-by-reshape矩阵,然后做你的A

m*n

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

© www.soinside.com 2019 - 2024. All rights reserved.