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)
out = bsxfun(@plus,permute(z,[3,1,2]),zeros(r,c));
假设我有一个非空向量 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)
out = bsxfun(@plus,permute(z,[3,1,2]),zeros(r,c));