我可以使用以下内容创建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]'
完成此操作?
答案 0 :(得分:7)
使用repmat
复制数据,然后permute
以正确的维度顺序设置数据。由permute
使用列主要订单产生repmat
的需求,要求您首先创建三个正确的10x10
切片,然后使用{{切换第一个和第三个维度1}}。
permute
答案 1 :(得分:5)
如果您不坚持使用repmat
,则可以使用ones
和bsxfun
:
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]
数组的原因[2 x 2 x 1 x 1 x 1]
的一个:隐含地存在尾随单例维度,因此被省略)。在这种情况下,您将[N x N]
矩阵与[1 x 1 x 3]
矩阵相乘,但前者被隐式解释为[N x N x 1]
矩阵。 bsxfun
负责其余的工作。