2012-11-13 61 views
4

我有一個結構稱爲poseSets,它包含兩個方面:MATLAB,結構以矩陣形式與矩陣面向正確的方法

  1. 姿
  2. 時間

所以我想要做的是將姿勢(Pose是一個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將交付。有誰知道一個班輪或更好的方式來做到這一點?

回答

6

是的,我也覺得這很煩人... Matlab中的一些事情似乎並不一致就行majorness或列majorness。這是一個例子,其中的東西是串聯在一起的(= row-major),而絕大多數算法是列主要的。 linspace或通用範圍(例如,x = 0:5:100)是行優先矩陣產生的另一個主要的例子,而是x(:)然後再次以列爲主...¯\(°_°)/¯

無論如何,最簡單的方法決心是強制列爲主串聯:

cat(1, structList.Pose) 
+0

或shiftdim ... – avishayp

+0

@avip:不,這也會轉換數據。這不是OP的願望...... –

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{:}].' 
3

試試這個:vertcat(structList.Pose)