【发布时间】:2015-12-07 15:28:26
【问题描述】:
我可以使用以下内容创建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]' 来做到这一点?
【问题讨论】:
标签: 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]' 来做到这一点?
【问题讨论】:
标签: matlab multidimensional-array
如果你不坚持使用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] 数组而不是 @987654339 @ one:尾随单例维度隐含存在,因此被省略)。在这种情况下,您将[N x N] 矩阵与[1 x 1 x 3] 相乘,但前者被隐式解释为[N x N x 1] 矩阵。 bsxfun 负责其余的工作。
【讨论】:
A 我认为 bsxfun 会处理最后的暗扩展。
使用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(reshape(A,1,1,[]),10,10);
A=cat( 3 , 1/3 , 1/2 , 1/4 ); B = repmat(A,10,10); 进一步简化代码。