在matlab / octave中将2d数组重塑为3d数组

时间:2014-06-16 01:14:07

标签: arrays matlab multidimensional-array octave

如何将二维数组重新整形为3d数组,并将最后一列用作页面? 在array2d中找到的所有数据都应该在页面中

示例:

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? (不确定这个数字应该是什么,所以我把问号放在占位符上)多维数组?

我想要的是拥有 所有这些都将在一个维度/页面上,所有两个将是另一个维度/页面等... -

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

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

假设矩阵的每个切片的尺寸相同,我们可以很容易地做到这一点。我们分别调用每个切片必须分别为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

此方法应针对每个切片推广任意数量的行和列,前提是每个切片共享相同的维度

答案 2 :(得分:0)

你的数组在第三维中已经是1的大小(换句话说,它已经是9x3x1,证明这个尝试输入array2d(1,1,1))。如果要沿第三维连接2d矩阵,可以使用cat

例如:

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

c将是2x2x2矩阵。

答案 3 :(得分:0)

这段代码是针对此示例的,我希望您能够了解如何使用其他数据样本。

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