通过乘以向量将2D矩阵扩展为3D矩阵

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.

  • 在这里,"permute"不会比"重塑"更合适吗? (3认同)

the*_*alk 6

有些reshapebsxfun会做:

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)


Adi*_*iel 6

我有另一种基准比较方法... 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)

  • 我喜欢它,但是`kron`和可读性....只有你有一些整洁的数学背景我会说! (2认同)