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

时间:2015-12-07 15:28:26

标签: matlab multidimensional-array

我可以使用以下内容创建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]'完成此操作?

2 个答案:

答案 0 :(得分:7)

使用repmat复制数据,然后permute以正确的维度顺序设置数据。由permute使用列主要订单产生repmat的需求,要求您首先创建三个正确的10x10切片,然后使用{{切换第一个和第三个维度1}}。

permute

答案 1 :(得分:5)

如果您不坚持使用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]矩阵相乘,但前者被隐式解释为[N x N x 1]矩阵。 bsxfun负责其余的工作。