【发布时间】:2018-02-13 02:49:24
【问题描述】:
问题
我有一个具有三个维度的向量场。我必须单独采样矢量的每个方向,因此三个网格在测量场内略微未对齐(sample 移动,而不是测量网格)。
当我重新调整我的测量值时,我的矢量分量不再相互正交,因为每个分量都有不同的变换。因为重新对齐也有平移,我认为每个采样点的旋转略有不同。基本上我想旋转我的样本点,但保持我的矢量方向并确保它们是正交的。
问题
如何正确“取消旋转”我的向量?
示例
示例 MatLab 代码(注意,我的真实数据中我只想在 MatLab 中进行校正,我不在 MatLab 中进行转换,只是创建假数据来举例):
n1=10; n2=10; n3=10; %10x10x10 samples for each direction / vector component measurement
sig=5; %smoothness of measured vector field
vec = struct; A = struct; %define structs
%define measurement grid
[vec(1).X,vec(2).X,vec(3).X] = ndgrid(1:n1,1:n2,1:n3); figure;
for itrans = 1:3
vec(itrans).x = imgaussfilt3(rand(n1,n2,n3), sig);%make random smooth vector field
t = rand(1,3); %random translations
r = rand(1,3)*2*pi/50; %random pitch roll yaw
%seperate rotation matrices
R1 = [1, 0, 0;...
0, cos(r(1)), sin(r(1));...
0,-sin(r(1)), cos(r(1))];
R2 = [cos(r(2)), 0,-sin(r(2));...
0, 1, 0;...
sin(r(2)), 0, cos(r(2))];
R3 = [cos(r(3)), sin(r(3)), 0;...
-sin(r(3)), cos(r(3)), 0;...
0, 0, 1];
%make affine component matrices
T = eye(4); T(1,4) = t(1); T(2,4) = t(2); T(3,4) = t(3);%make translation matrix
R = R1*R2*R3; R(4,4) = 1;%combine rotations
S = eye(4); %no skew or scaling
%compose affine transformation
A(itrans).mat = T*R*S;
%apply transformation to coordinates and plot alignment
X = [vec(1).X(:)'; vec(2).X(:)'; vec(3).X(:)';ones(1,numel(vec(3).X))]; XX = A(itrans).mat*X;
subplot(1,3,itrans); scatter3(vec(1).X(:),vec(2).X(:),vec(3).X(:)); hold on; title('displacement measurement 3'); scatter3(XX(1,:)',XX(2,:)',XX(3,:)', 'r'); legend('original', 'displaced')
end
%apply tranformation to data
for itrans = 1:3
vec(itrans).xtrans = interp3(vec(itrans).x ,XX(1,:)',XX(2,:)',XX(3,:)','cubic',0);
end
%plot new vectors
figure; subplot(1,2,1); quiver3(vec(1).X,vec(2).X,vec(3).X,vec(1).x,vec(2).x,vec(3).x); title('original field')
subplot(1,2,2); quiver3(vec(1).X,vec(2).X,vec(3).X,vec(1).xtrans,vec(2).xtrans,vec(3).xtrans); legend('displaced field')
三个重新对齐的坐标,矢量场的每个分量都被平移和旋转,略有不同。
原始场,一个向量的每个分量都没有真正在同一位置测量,我通过变换坐标然后对我的测量值进行插值来进行校正。
变换后的场,一个向量的每个分量不再真正沿着它所代表的轴,它们不再相互正交。
试图用油漆在 2d 中显示问题。每个箭头表示一个测量分量,每个十字表示一个坐标系。两个蓝色箭头是我测量的两个组件,两个灰色箭头是我重新调整测量后的结果,两个橙色箭头是我在以某种方式“不旋转”并将它们组合后需要的结果。
【问题讨论】:
-
这是 Yee 单元格吗?
-
我不知道 yee 细胞是什么,但它只是一个 3d 矢量场,我分别测量了三个分量。只是每次测量的位置和轴都不相同。我知道它离一些“世界”参考有多远,这是我得到仿射变换的地方。然而,在那之后我的测量结果与以前不同。
标签: matlab multidimensional-array transform linear-algebra calculus