【问题标题】:reshape 2d array to 3d array in matlab /octave在 matlab /octave 中将 2d 数组重塑为 3d 数组
【发布时间】:2014-08-05 19:07:11
【问题描述】:

如何将 2d 数组重塑为 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? (不确定这个数字应该是多少,所以我放了一个问号作为占位符) 多维数组?

我想要得到的是 所有的都在一个维度/页面上,所有的两个都在另一个维度/页面上等等...... -

我试过 reshape(array2d,[9,3,1]) 还是 9x3

【问题讨论】:

  • 你需要使用repmat或者给出一个简单的小例子
  • @natan 我想要得到的是让所有的都在一个维度/页面上,所有两个都将是另一个维度/页面等...... -
  • 我还是不明白,如果你写a(:,:,1)=[1 2 ; 1 2]a(:,:,2)会是什么样子?
  • @natan:OP 在更大的 2D 矩阵中堆叠了 2D 矩阵。这些 2D 矩阵中的每一个都包含一个数字,因此有一个全为 1 的 3 x 3 矩阵,一个全为 2 的 3 x 3 矩阵,等等。OP 希望采用这些矩阵中的每一个并创建一个堆叠的 3D 矩阵,其中每个切片仅对应于仅此数字的 2D 矩阵。因此,out(:,:,1) = ones(3,3), out(:,:,2) = 2*ones(3,3)... 等,给定上面的例子。

标签: arrays matlab multidimensional-array octave


【解决方案1】:

使用 permutereshape -

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

【讨论】:

    【解决方案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
    

    如果每个切片共享相同的维度,则此方法应适用于每个切片的任意数量的行和列。

    【讨论】:

    • 当我改变 array2d=[7,3,7; ... 3,3,3; ... 3,3,3; ... 4,4,4; ... 4,4,4; ... 4,4,4; ... 2,2,2; ... 2,2,2; ... 2,2,2; ... 1,1,1; ... 1,1,1; ... 1,1,1];我收到一个错误“错误:重塑:无法将 7x1 数组重塑为 3x3 数组您是否直接从数据值中进行重塑?如果是这样,是否可以不根据数据重塑数组,而是根据行数/列本身?
    • @RickT:如果你有7,3,7,这将不起作用。它查看数据本身。如果您希望对此进行更改,请相应地更新您的问题描述。
    • @RickT:你想忽略所有不遵循模式的行吗?还是不太清楚。
    • @RickT - 没问题。 Divakar 的解决方案更适合您的需求。我完全误解了你的问题。祝你好运。
    • +1 通过输出使问题更清晰
    【解决方案3】:

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

    例如:

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

    c 将是一个 2x2x2 矩阵。

    【讨论】:

    • 我想我的意思是所有的都在一个维度/页面上,所有的两个都在另一个维度/页面上等等......
    • 在示例中排列 array2d 的方式,您可以执行 cat(3,array2d(1:3,:),array2d(4:6,:),array2d(7:9,: ))。如果你的页面是固定高度的,你可以很容易地把它变成一个 for 循环。
    【解决方案4】:

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

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

    【讨论】:

    • 0 将导致您的矩阵为空,因为0 不是第三维的有效大小。另外,for 循环中的out2 应该是out。我也尝试运行此代码,当您尝试连接时它给了我一个错误。它失败的原因是你如何声明out。这个例子应该是zeros(3,3)。此外,如果col 不是3,则此代码将不起作用。
    • @rayryeng 感谢您指出错误,对不起,我没有听从您的建议,再次犯了同样的错误,我已经更正了,错误是声明out2 而不是out。而且我相信它适用于不同的列大小,因为每个具有值 123 的块具有相同的大小
    • 第一行仍然会给你带来问题。您正在声明一个 9x3x0 数组,它将为您提供空矩阵。此外,如果您删除0,它将生成一个9 x 3 矩阵以开始。当您尝试连接矩阵时,它会在循环中为您提供3x3 矩阵,而您最初是从9x3 矩阵开始的。 cat 命令在拼接时会因为大小不一致而抛出错误。
    • 如果您使矩阵最初为空,则可以避免此 cat 错误,或者 out2 = []; 您在上面所做的是您声明了一个空矩阵 9x3x0,而它应该只是空的开始。
    • @rayryeng 谢谢,我现在更正了。再次抱歉重复错误。我知道我说了很多次对不起,看起来我不是故意的,但请相信我。
    猜你喜欢
    • 1970-01-01
    • 2017-09-18
    • 1970-01-01
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    • 2020-11-16
    相关资源
    最近更新 更多