Matlab 如何使用repmat将一维向量重塑为三维矩阵?
我可以使用以下内容创建Matlab 如何使用repmat将一维向量重塑为三维矩阵?,matlab,multidimensional-array,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]实现这一点?用于复制数据,然后将其设置为正确的维度顺序。permute的需要源于repmat使用列主顺序,要求您首先创建三个正确的10x10切片,然后使用permute切换第一和第三维度 A = [1/4 1/2 1/4].'; % your data B = r
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]
实现这一点?用于复制数据,然后将其设置为正确的维度顺序。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]))
这将创建一个nxnx3
数组,其中每个元素都是1
。然后我们将每个子矩阵(从上一个索引中的1
到3
)乘以v
中的相应值,这是通过bsxfun
实现的。为此,我们必须在v
中引入领先的单态维度(将其转换为[1 x 1 x 3]
),这就是调用置换的目的
更新:如注释中所述,您可以在首次定义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中,假设每个变量都有无穷多个尾随单态维数(这就是为什么整形(rand(2),[2 2 2 1 1])
返回一个[2 x 2]
数组,而不是[2 x 2 x 1 x 1]
one:后面的单例维度隐式存在,因此被省略)。在这种情况下,将[N x N]
矩阵与[1 x 1 x 3]
一相乘,但前者被隐式解释为[N x N x 1]
一bsxfun
处理其余部分。首先permute
(或restrape
)然后repmat
,可能会更快,因为这样做的话,排列/重新塑造的元素就更少了:A=[1/4 1/2 1/4];B=repmat(重塑(A,1,1,[]),10,10)代码>或A=cat(3,1/3,1/2,1/4);B=repmat(A,10,10)
进一步简化代码。您甚至可以从2Da
开始,我认为,bsxfun
将处理最后的dim扩展。