【问题标题】:repmat and/or transpose into singleton dimensionsrepmat 和/或转置为单一维度
【发布时间】:2015-07-29 15:29:58
【问题描述】:

假设我有一个非空向量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() 将行向量整形为列向量,反之亦然,是否有一个函数可以将行/列向量整形为单维并返回?

提前致谢!

【问题讨论】:

  • 我认为permute 是转置的n-d 类似物。 Transpose 交换前两个维度,permute 交换任意维度

标签: matlab matrix transpose


【解决方案1】:

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

【讨论】:

  • permute 是否在做我在推论中询问的事情?
  • @marcman - 是的。使用 permute 转换为单例 3D 向量,然后使用 ipermute 撤消它。
  • @marcman - 假设你有一个 3D 矩阵 - 如果你想独立地对每个切片进行转置,你可以这样做:permute(A, [2 1 3])。这将交换行和列,但保持第三维不变。不支持通过transpose() / ' / .' 在 MATLAB 中进行 3D 转置...所以permute 是一种方法。
  • @marcman - 我们有人回答你的问题了吗?如果您需要任何进一步的帮助,请告诉我们。
  • 是的,你们都做到了。这两种方法都是可行的,所以我很纠结该选哪一种。
【解决方案2】:

您可以使用 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));

【讨论】:

  • 啊,这么想的好方法!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-25
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 2017-02-19
相关资源
最近更新 更多