2014-03-04 25 views
3

M是仿射變換矩陣,可以從一個變換座標系到另一個如下:如何將仿射變換(4x4矩陣)應用於ndgrid/meshgrid結果?

v_old = [ x_old y_old z_old 1]; 
v_new = M * v_old; 
% v_new contains [ x_new y_new z_new 1 ] 

現在,我已經ndgrid/meshgrid的形式得到了座標:

[ X_old Y_old Z_old ] = ndgrid(0:15); % for instance 

我如何將這些轉換爲X_new等?

我可以做三個for循環循環(X_old(i,j,k)對應於x_old以上),但必須有一個更好的解決方案。

回答

2

你只需要重新排列這些值,使每個點都有它的四個座標一行:

result = [X_old(:) Y_old(:) Z_old(:) ones(numel(X_old),1)] * M; 

result每行給出了每個點的新座標。

請注意,這適用於矩陣A乘以矩陣B的乘積與A乘以B的每一行相同。

或者,如果您不能負擔建(由於內存的限制)上述矩陣,使用

result = X_old(:)*M(1,:) + Y_old(:)*M(2,:) + Z_old(:)*M(3,:) + ones(numel(X_old),1)*M(4,:); 

在這兩種情況下,如果要重新排列的結果,使其具有相同的大小爲X_oldY_oldZ_old,以此作爲最後一步:

s = size(X_old); 
X_new = reshape(result(:,1), s); 
Y_new = reshape(result(:,2), s); 
Z_new = reshape(result(:,3), s); 
+1

整潔!我有一個非常大的矩陣,但(X_old是512x512x300),所以我不能創建矩陣,而我仍然得到ndgrid結果。 – Anna

+0

(「保證」在「保留在RAM中」) – Anna

+0

@Anna在這種情況下,您可能需要一個循環來構建矩陣的每一行:'result(ii,:) = [X_old(ii)Y_old(ii)Z_old (ii)1] * M;'其中'ii'是循環變量(從'1'到'numel(X)')。或者在塊中建立矩陣,使用盡可能多的行,每塊可以承受 –