repmat and/or 转置为单一维度

repmat and/or transpose into singleton dimensions

假设我有一个非空向量 z

我想复制这个向量并将其整形为维度为 [r, c, length(z)] 的矩阵。

例如:

z = 1:5;
r = 3;
c = 3;

我正在寻找一个函数给我:

ans(:, :, 1) =
    [ 1 1 1 ]
    [ 1 1 1 ]
    [ 1 1 1 ]

ans(:, :, 2) =
    [ 2 2 2 ]
    [ 2 2 2 ]
    [ 2 2 2 ]

...

ans(:, :, 5) =
    [ 5 5 5 ]
    [ 5 5 5 ]
    [ 5 5 5 ]

注意: 做类似

的事情
tmp = zeros(r,c,length(z));
tmp = repmat(z, 3, 3, 1);

不起作用。相反,它 returns 一个 15x15 矩阵作为

tmp = 
[ 1:5, 1:5, 1:5 ]
[ 1:5, 1:5, 1:5 ]
[ 1:5, 1:5, 1:5 ]

不是我想要的

先转置 z 也不行。

我知道的唯一解决方案 是最初将 z 设置为向量的第 3 维:

z(1,1,:) = 1:5;

有没有更有效的方法来做到这一点?或者这是最有效的方法?

推论:是否有类似 "transpose" 的函数将向量转置为单一维度?也就是说,如果 transpose() 将行向量整形为列向量,反之亦然,是否存在将 row/column 向量整形为单一维度并返回的函数?

提前致谢!

首先 permute 向量,使其成为单个 3D 向量,然后 使用 repmat:

z = permute(1:5, [1 3 2]);
r = 3; c = 3;
out = repmat(z, [r c]);

我们得到:

>> out

out(:,:,1) =

     1     1     1
     1     1     1
     1     1     1


out(:,:,2) =

     2     2     2
     2     2     2
     2     2     2


out(:,:,3) =

     3     3     3
     3     3     3
     3     3     3


out(:,:,4) =

     4     4     4
     4     4     4
     4     4     4


out(:,:,5) =

     5     5     5
     5     5     5
     5     5     5

permute 通过打乱输入向量的维度来工作。我们在这里所做的是我们正在切换列值,以便它们出现在单个 3D 向量的切片中。然后,我们将这个 3D 向量复制到任意多行和任意多列。

如果permute令人困惑,那么假设z还没有分配,你也可以这样做:

z(1,1,:) = 1:5;

然后您可以继续使用此 z 和我之前谈到的相同 repmat 语法。

您可以使用 ndgrid

生成它
z = 1:5;
r = 3;
c = 3;
[~,~,out]=ndgrid(1:r,1:c,z)

或使用bsxfun and permute

out = bsxfun(@plus,permute(z,[3,1,2]),zeros(r,c));