我可以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]'
给出的向量来完成?
使用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
如果您不坚持使用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]
1 相乘,但前者被隐式解释为[N x N x 1]
1.bsxfun
照顾其余的.