我有一个3D矩阵A
(size 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)
另一个没有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.
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