我有一个3D矩阵n x m x p,其中p代表1400个每日2D数据阵列。我还有一个长度为p x 1的逻辑数组。如何创建一个新的3D矩阵,其中只包含p=1的“页面”?
daupos2t1#
这应该以与1D或2D数组的逻辑索引相同的方式工作。
n = 3; m = 4; p = 5; tmp = rand([n,m,p]); p_mask = logical([1 0 1 0 0]); new = tmp(:,:,p_mask);
一个小的警告是,“逻辑”数组必须是logical类型。如果你使用一个包含1和0的双精度数组,Matlab会假设你想做常规(位置)索引,并抱怨因为你试图访问索引0处的元素,这是越界的:
logical
Index in position 3 is invalid. Array indices must be positive integers or logical values.
编辑:上面对logical类型的强制转换只是为了说明“逻辑”索引只适用于逻辑类型,而不适用于浮点或整数类型。通常,逻辑索引将由一些条件来定义,例如p_mask = p_vals == 1;,其中p_vals将是包含1和0的数组。当然也没有必要为逻辑掩码创建一个新变量-new = tmp(:,:,p_vals == 1)也可以。
p_mask = p_vals == 1;
p_vals
new = tmp(:,:,p_vals == 1)
xpszyzbs2#
在MATLAB中,从这个n*m*p矩阵中提取页面或切片就像选择要取的页面一样简单。
n*m*p
np=1400 n=3;m=3; % page size, just as example A=randi([-20 20],n,m,np); % the n x m x p input matrix p=randi([0 1],1,np); % selector p_selection=find(p==1); B=A(:,:,p_selection); % selected pages
2条答案
按热度按时间daupos2t1#
这应该以与1D或2D数组的逻辑索引相同的方式工作。
一个小的警告是,“逻辑”数组必须是
logical
类型。如果你使用一个包含1和0的双精度数组,Matlab会假设你想做常规(位置)索引,并抱怨因为你试图访问索引0处的元素,这是越界的:编辑:上面对
logical
类型的强制转换只是为了说明“逻辑”索引只适用于逻辑类型,而不适用于浮点或整数类型。通常,逻辑索引将由一些条件来定义,例如p_mask = p_vals == 1;
,其中p_vals
将是包含1和0的数组。当然也没有必要为逻辑掩码创建一个新变量-new = tmp(:,:,p_vals == 1)
也可以。xpszyzbs2#
在MATLAB中,从这个
n*m*p
矩阵中提取页面或切片就像选择要取的页面一样简单。