Art*_*lew 8 arrays matlab matrix multidimensional-array
这就是我想要实现的目标:
我有一个矩阵C.
C=[1 2 3; 4 5 6; 7 8 9];
Run Code Online (Sandbox Code Playgroud)
和一个矢量 a
a=[1 2];
Run Code Online (Sandbox Code Playgroud)
我想做一个这样的操作,a矢量的每个元素都乘以C(标量乘法),并且out是一个三维数组D:
(:,:,1) =
1 2 3
4 5 6
7 8 9
(:,:,2) =
2 4 6
8 10 12
14 16 18
Run Code Online (Sandbox Code Playgroud)
它肯定会在循环中起作用,但是,由于我需要在多个场合进行此操作,因此oneliner将是一个很好的保护程序.
hba*_*rts 11
这是使用bsxfun和的一个很好的例子reshape.虽然@thewaywewalks提议首先调用bsxfun并重塑结果,但我建议相反.这使得bsxfun单身维度扩展的关键概念之一更加清晰:
out = bsxfun(@times,C,reshape(a,1,1,[]))
ans(:,:,1) =
1 2 3
4 5 6
7 8 9
ans(:,:,2) =
2 4 6
8 10 12
14 16 18
Run Code Online (Sandbox Code Playgroud)
有了reshape(a,1,1,[]),你就a成了第三个维度.如果你现在申请bsxfun,它会将矩阵C与每个元素相乘a.
out = reshape(bsxfun(@mtimes, C(:), a(:).'), [size(C),numel(a)] )
Run Code Online (Sandbox Code Playgroud)
正如hbaderts中所建议的那样,人们也可以使用bsxfun维度扩展的能力,并提供一系列因素:
out = bsxfun(@mtimes,C,permute(a,[3,1,2]))
Run Code Online (Sandbox Code Playgroud)
out(:,:,1) =
1 2 3
4 5 6
7 8 9
out(:,:,2) =
2 4 6
8 10 12
14 16 18
Run Code Online (Sandbox Code Playgroud)
我有另一种基准比较方法... IMO这是最好的方法,至少对于语法/可读性术语:
out = reshape(kron(a,C),[size(C),numel(a)]);
out(:,:,1) =
1 2 3
4 5 6
7 8 9
out(:,:,2) =
2 4 6
8 10 12
14 16 18
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
524 次 |
| 最近记录: |