首页 > 解决方案 > 相对于原始数组在不同位置重塑元素 - matlab

问题描述

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位置相对于它们在原始数组中的位置不同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

标签: matlabreshape

解决方案


当我对您的代码进行这些更改时,输出与您的预期输出相匹配:

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

(也可能在其他方面,例如他建议乘法可以完成同样的事情。)


推荐阅读