4

我有一个名为poseSets的结构,它包含两件事:

  1. 姿势
  2. 时间

所以我想要做的是将姿势(姿势是一个 4x4 矩阵)放入一个大的长(4xN_Poses) x 4矩阵中。

所以让我们想象一下我有一个 10 长的结构列表。通过这样做,我几乎可以得到我的清单:

[structList.Pose]

但这给了我一个(4xN) x 4矩阵,即:

1 2 3 4 | 1 2 3 4 | 1 2 3 4 | ...
5 6 7 8 | 5 6 7 8 | 5 6 7 8 | ...
3 5 6 8 | 3 5 6 8 | 3 5 6 8 | ...
0 0 0 1 | 0 0 0 1 | 0 0 0 1 | ...

但我真正想要的是:

1 2 3 4
5 6 7 8
3 5 6 8
0 0 0 1
_______ 
1 2 3 4
5 6 7 8
3 5 6 8
0 0 0 1
_______ 
1 2 3 4
5 6 7 8
3 5 6 8
0 0 0 1
_______ 
: : : :

现在我不能转置它,因为每个矩阵都会被单独转置并且是错误的方式。

现在您可以使用 for 循环来解决这个问题:

poseList = [];

for i = 1:length(PoseSets);
    poseList = [poseList; PoseSets(i).Pose];
end

注意:poseList 包含我想要的。

但我个人认为 matlab 很神奇,你应该能够用英语写出你想要的东西,matlab 会提供。有谁知道一个班轮或更好的方法来做到这一点?

4

3 回答 3

6

是的,我也觉得这很烦人……Matlab 中的某些内容在行优先或列优先方面似乎不一致。这是一个例子,其中事物是按列连接的(= 行优先),而绝大多数算法都是列优先的。linspace或通用范围(例如,x = 0:5:100)是行优先矩阵生成的另一个主要例子,而x(:)然后又是列优先......¯\(°_°)/¯

无论如何,最简单的解决方法是强制列主连接:

cat(1, structList.Pose)
于 2012-11-13T07:20:06.710 回答
3

试试这个:vertcat(structList.Pose)

于 2012-11-13T09:57:23.757 回答
1

可以做到,但肯定不是单行:

% generate some data
M = magic(4)
poseSets = struct('pose',M);
poseSets = repmat(poseSets,3,1)

poseList = cellfun(@transpose, {poseSets.pose}, 'UniformOutput', false);
poseList = [poseList{:}].'
于 2012-11-13T07:47:42.717 回答