在matlab /octave中重塑二维数组为三维数组



我如何重塑2d数组到3d数组与最后一列被用作页面?在array2d中找到的所有数据都应该在pages

的例子:

array2d=[7,.5,12; ...
1,1,1; ...
1,1,1; ...
4,2,4; ...
2,2,2; ...
2,2,2; ...
3,3,3; ...
3,3,3; ...
3,3,3];

数组中的第一页应该是7、5、12;1, 1, 1;1, 1, 1;

数组中的第二页应该是4、2、4;2、2、2;2, 2, 2,

数组中的第三页应该是3, 3, 3;3, 3, 3;3, 3, 3,

这是一个9x3数组我怎么能得到它是一个9x3x?(不确定这个数字应该是什么,所以我放置了一个问号作为占位符)多维数组?

我想要的是拥有所有的1都在一个维度/页面上,所有的2都在另一个维度/页面上,等等…-

我尝试了重塑(array2d,[9,3,1])它仍然是9x3

使用 permute reshape -

N = 3;  %// Cut after every N rows to form a "new page"
array3d = permute(reshape(array2d,N,size(array2d,1)/N,[]),[1 3 2]) %// output

假设矩阵的每个切片的维数相同,我们可以很容易地做到这一点。让我们把每个切片的行数和列数分别称为MN。在您的示例中,这将是M = 3N = 3。因此,假设array2d是上述形式,我们可以执行以下操作:

M = 3;
N = 3; %// This is also simply the total number of columns we have,
       %// so you can do size(array2d, 2);
outMatrix = []; %// Make this empty.  We will populate as we go.
%// Figure out how many slices we need
numRows = size(array2d,1) / M;
for k = 1 : numRows
    %// Extract the k'th slice
    %// Reshape so that it has the proper dimensions
    %// of one slice
    sliceK = reshape(array2d(array2d == k), M, N);
    %// Concatenate in the third dimension
    outMatrix = cat(3,outMatrix,sliceK);
end
根据你的例子,我们得到:
>> outMatrix
outMatrix(:,:,1) =
     1     1     1
     1     1     1
     1     1     1
outMatrix(:,:,2) =
     2     2     2
     2     2     2
     2     2     2
outMatrix(:,:,3) =
     3     3     3
     3     3     3
     3     3     3

如果每个切片共享相同的维度,则该方法应该泛化到每个切片的任意行数和列数。

你的数组在第三维度上的大小已经是1(换句话说,它已经是9x3x1,为了证明这一点,尝试输入array2d(1,1,1))。如果你想在三维上连接二维矩阵,你可以使用cat.

例如:

a = [1,2;3,4];
b = [5,6;7,8];
c = cat(3,a,b);

c将是一个2x2x2矩阵

这段代码是专门针对这个例子的,我希望你能理解如何去做其他的数据样本。

out2 = [];
col = size(array2d,2);
for i = 1:3        
    temp2 = reshape(array2d(array2d == i),[],col);
    out2 = cat(3,out2,temp2);
end

相关内容

  • 没有找到相关文章

最新更新