4

poseSets という構造体があり、次の 2 つが含まれています。

  1. ポーズ
  2. 時間

だから私がやりたいのは、ポーズ (ポーズは 4x4 マトリックス) を 1 つの大きな長い(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の一部の項目は、行の主要性または列の主要性に関して一貫していないようです。これは、アルゴリズムの大部分が列メジャーであるのに対し、物事が列ごとに連結されている(=行メジャー)1つの例です。linspaceまたは一般的な範囲(たとえば、x = 0:5:100)は、行メジャーの行列生成のもう1つの主要な例ですが、列メジャーの場合も同様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 に答える