当前位置:  开发笔记 > 编程语言 > 正文

如何使用repmat将1d矢量重塑为3d矩阵?

如何解决《如何使用repmat将1d矢量重塑为3d矩阵?》经验,为你挑选了2个好方法。

我可以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]'给出的向量来完成?



1> Adriaan..:

使用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(重塑(A,1,1,[]),1​​0,10);`

2> Andras Deak..:

如果您不坚持使用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.然后我们将每个子矩阵(从最后一个索引13最后一个索引)与相应的值相乘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]数组而不是一个数组[2 x 2 x 1 x 1 x 1]:隐含地存在尾随单例维度,因此被省略).在这种情况下,您将[N x N]矩阵与[1 x 1 x 3]1 相乘,但前者被隐式解释为[N x N x 1]1.bsxfun照顾其余的.

推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有