repmat和/或转换为单个维度

时间:2015-07-29 15:29:58

标签: matlab matrix transpose

我们说我有一个非空的向量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);

不起作用。相反,它返回15x15矩阵作为

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

不是我想要的

首先转置z也不起作用。

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

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

有更有效的方法吗?或者这是最有效的方法吗?

COROLLARY:是否有一个"转置"类似的函数将向量转换为单一维度?也就是说,如果transpose()将行向量整形为列向量,反之亦然,那么是否有一个函数可以将行/列向量整形为单个维度并返回?

提前致谢!

2 个答案:

答案 0 :(得分:3)

首先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语法。

答案 1 :(得分:3)

您可以使用ndgrid

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

或使用bsxfunpermute

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