a=randn(4,4,2,3)
a(:,:,1,1) =
0.5377 0.3188 3.5784 0.7254
1.8339 -1.3077 2.7694 -0.0631
-2.2588 -0.4336 -1.3499 0.7147
0.8622 0.3426 3.0349 -0.2050
a(:,:,2,1) =
-0.1241 0.6715 0.4889 0.2939
1.4897 -1.2075 1.0347 -0.7873
1.4090 0.7172 0.7269 0.8884
1.4172 1.6302 -0.3034 -1.1471
a(:,:,1,2) =
-1.0689 0.3252 -0.1022 -0.8649
-0.8095 -0.7549 -0.2414 -0.0301
-2.9443 1.3703 0.3192 -0.1649
1.4384 -1.7115 0.3129 0.6277
a(:,:,2,2) =
1.0933 -1.2141 -0.7697 -1.0891
1.1093 -1.1135 0.3714 0.0326
-0.8637 -0.0068 -0.2256 0.5525
0.0774 1.5326 1.1174 1.1006
a(:,:,1,3) =
1.5442 -1.0616 -0.1924 -1.4224
0.0859 2.3505 0.8886 0.4882
-1.4916 -0.6156 -0.7648 -0.1774
-0.7423 0.7481 -1.4023 -0.1961
a(:,:,2,3) =
1.4193 -0.8045 0.2157 0.7223
0.2916 0.6966 -1.1658 2.5855
0.1978 0.8351 -1.1480 -0.6669
1.5877 -0.2437 0.1049 0.1873
[d1 d2 d3 d4]=size(a);
aa=reshape(a,[],d4)';
b(:,:,1)=[0 0 1 0;0 0 0 0; 0 0 0 0 ;0 0 0 0]
b(:,:,2)=[0 0 1 0;0 0 0 0; 0 0 0 0 ;0 0 0 0]
bb=reshape(b,1,[]);
aa(:,find(~bb))=NaN;
c=reshape(aa,d1,d2,d3,d4);
c(:,:,1,1) =
NaN NaN NaN NaN
NaN NaN NaN NaN
NaN NaN NaN NaN
NaN NaN NaN NaN
c(:,:,2,1) =
NaN NaN 3.5784 NaN
NaN NaN -0.1022 NaN
NaN NaN -0.1924 NaN
NaN NaN NaN NaN
c(:,:,1,2) =
NaN NaN NaN NaN
NaN NaN NaN NaN
NaN NaN NaN NaN
NaN NaN NaN NaN
c(:,:,2,2) =
NaN NaN NaN NaN
NaN NaN NaN NaN
NaN NaN NaN NaN
NaN NaN NaN NaN
c(:,:,1,3) =
NaN NaN 0.4889 NaN
NaN NaN -0.7697 NaN
NaN NaN 0.2157 NaN
NaN NaN NaN NaN
c(:,:,2,3) =
NaN NaN NaN NaN
NaN NaN NaN NaN
NaN NaN NaN NaN
NaN NaN NaN NaN
为什么c
中的nonnan元素相对于它们在原始数组a
中的位置处于不同的位置?
我期待输出
c(:,:,1,1) =
NaN NaN 3.5784 NaN
NaN NaN NaN NaN
NaN NaN NaN NaN
NaN NaN NaN NaN
c(:,:,2,1) =
NaN NaN 0.4889 NaN
NaN NaN NaN NaN
NaN NaN NaN NaN
NaN NaN NaN NaN
c(:,:,1,2) =
NaN NaN -0.1022 NaN
NaN NaN NaN NaN
NaN NaN NaN NaN
NaN NaN NaN NaN
c(:,:,2,2) =
NaN NaN -0.7697 NaN
NaN NaN NaN NaN
NaN NaN NaN NaN
NaN NaN NaN NaN
c(:,:,1,3) =
NaN NaN -0.1924 NaN
NaN NaN NaN NaN
NaN NaN NaN NaN
NaN NaN NaN NaN
c(:,:,2,3) =
NaN NaN 0.2157 NaN
NaN NaN NaN NaN
NaN NaN NaN NaN
NaN NaN NaN NaN
答案 0 :(得分:2)
当我对代码进行这些更改时,输出与预期输出匹配:
a = randn(4,4,2,3);
[d1 d2 d3 d4] = size(a);
aa = reshape(a,[],d4); % <-- NOTE! no transpose
b = [0 0 1 0;0 0 0 0; 0 0 0 0 ;0 0 0 0];
b(:,:,2) = [0 0 1 0;0 0 0 0; 0 0 0 0 ;0 0 0 0];
bb = reshape(b,1,[]);
aa(find(~bb),:) = NaN; % <-- NOTE! swapped indexing
c = reshape(aa,d1,d2,d3,d4);
通过转置数组aa
,而不是稍后转置,所有元素都会在不同的位置结束。
编辑:@Sardar Usama在下面的评论中提出了一个很好的观点。你可以完成同样的事情:
c = a;
c(repmat(~b,[1,1,1,3])) = NaN
(也可能在其他方面也是如此,例如他建议乘法可以完成同样的事情。)