【问题标题】:How to use repmat to reshape a 1d vector into a 3d matrix?如何使用 repmat 将 1d 向量重塑为 3d 矩阵?
【发布时间】:2015-12-07 15:28:26
【问题描述】:

我可以使用以下内容创建10x10x3 矩阵:

A(1:10,1:10,1) = 1/4;
A(1:10,1:10,2) = 1/2;
A(1:10,1:10,3) = 1/4;

如何使用repmat 和给定的向量[1/4 1/2 1/4]' 来做到这一点?

【问题讨论】:

    标签: matlab multidimensional-array


    【解决方案1】:

    如果你不坚持使用repmat,那么你可以使用onesbsxfun

    N = 10;
    v = [1/4 1/2 1/4];
    A = ones(N,N,3);
    A = bsxfun(@times,A,permute(v,[3 1 2]))
    

    这将创建一个N x N x 3 数组,其中每个元素都是1。然后我们将每个子矩阵(从1 到最后一个索引中的3)与来自v 的相应值相乘,这是通过bsxfun 实现的。为此,我们必须在v 中引入领先的单例维度(将其转换为[1 x 1 x 3]),这就是调用permute 的目的。

    更新:正如@Divakar 在评论中指出的那样,您可以在首次定义A 时省略最后一个维度:

    N = 10;
    v = [1/4 1/2 1/4];
    A = ones(N,N); %one less dimension
    A = bsxfun(@times,A,permute(v,[3 1 2]))
    

    原因是在 matlab 中,假设每个变量都有无限数量的 尾随 单例维度(这就是为什么 reshape(rand(2),[2 2 1 1 1]) 返回 [2 x 2] 数组而不是 @987654339 @ one:尾随单例维度隐含存在,因此被省略)。在这种情况下,您将[N x N] 矩阵与[1 x 1 x 3] 相乘,但前者被隐式解释为[N x N x 1] 矩阵。 bsxfun 负责其余的工作。

    【讨论】:

    • 你甚至可以从 2D 开始 A 我认为 bsxfun 会处理最后的暗扩展。
    【解决方案2】:

    使用repmat 复制您的数据,然后使用permute 将其设置为正确的维度顺序。对permute 的需求源于repmat 使用列优先顺序,要求您首先创建三个正确的10x10 切片,然后使用permute 切换第一和第三维度。

    A = [1/4 1/2 1/4].'; % your data
    B = repmat(A,1,10,10); % use repmat to create a 3x10x10 copy
    C=permute(B,[3 2 1]); % permute to the correct order
    
    ans(:,:,1) =
    
        0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500
        0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500
        0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500
        0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500
        0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500
        0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500
        0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500
        0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500
        0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500
        0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500
    
    
    ans(:,:,2) =
    
        0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000
        0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000
        0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000
        0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000
        0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000
        0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000
        0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000
        0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000
        0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000
        0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000
    
    
    ans(:,:,3) =
    
        0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500
        0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500
        0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500
        0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500
        0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500
        0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500
        0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500
        0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500
        0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500
        0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500    0.2500
    

    【讨论】:

    • permute(或reshape)然后repmat可能会更快,因为这样可以用更少的元素完成置换/重塑:A = [1/4 1/2 1/4].'; B = repmat(reshape(A,1,1,[]),10,10);
    • A=cat( 3 , 1/3 , 1/2 , 1/4 ); B = repmat(A,10,10); 进一步简化代码。
    猜你喜欢
    • 2017-12-03
    • 2011-01-16
    • 2016-11-08
    • 1970-01-01
    • 2014-03-03
    • 2021-02-25
    • 2018-06-01
    • 2015-01-24
    • 1970-01-01
    相关资源
    最近更新 更多