旋转矩阵按列计算而不是按行计算

时间:2010-05-03 22:54:49

标签: matlab matrix rotation linear-algebra robotics

我有一个名为forest的类和一个名为fixedPositions的属性,它存储100个点(x,y),它们在MatLab中存储250x2(行x列)。当我选择'fixedPositions'时,我可以点击散点图并绘制点。

现在,我想旋转绘制的点,我有一个旋转矩阵,可以让我这样做。

以下代码应该有效:

theta = obj.heading * pi / 180; apparent = [cos(theta)-sin(theta); sin(theta)cos(theta)] * obj.fixedPositions;

但它不会。我收到了这个错误。

???使用==>时出错mtimes 内部矩阵尺寸必须一致。

==>中的错误地标> landmarks.get.apparentPositions at 22             apparent = [cos(theta)-sin(theta); sin(theta)cos(theta)] * obj.fixedPositions;

当我更改forest.fixedPositions以存储变量2x250而不是250x2时,上面的代码将起作用,但它不会绘制。我将在模拟中不断地绘制fixedPositions,所以我更愿意保留它,并使旋转工作。

有什么想法吗?

另外,固定位置是xy点的位置,就像你正向前看一样。即heading = 0. heading设置为45,表示我想将点顺时针旋转45度。

这是我的代码:

classdef landmarks
  properties
    fixedPositions   %# positions in a fixed coordinate system. [x, y]
    heading = 45;     %# direction in which the robot is facing
  end
  properties (Dependent)
    apparentPositions
  end
  methods
    function obj = landmarks(numberOfTrees)
        %# randomly generates numberOfTrees amount of x,y coordinates and set 
        %the array or matrix (not sure which) to fixedPositions
        obj.fixedPositions = 100 * rand([numberOfTrees,2]) .* sign(rand([numberOfTrees,2]) - 0.5);
    end
    function apparent = get.apparentPositions(obj)
        %# rotate obj.positions using obj.facing to generate the output
        theta = obj.heading * pi/180;
        apparent = [cos(theta)  -sin(theta) ; sin(theta)  cos(theta)] * obj.fixedPositions;
    end
  end
end

P.S。如果你改变一行:obj.fixedPositions = 100 * rand([2,numberOfTrees])。* sign(rand([2,numberOfTrees]) - 0.5);

一切都会好起来......它只是不会阴谋。

ans = obj.fixedPositions;答;将它翻转到我需要绘制的内容,但必须有一种方法可以避免这种情况吗?

2 个答案:

答案 0 :(得分:4)

一种解决方案是计算上面旋转矩阵的转置并将其移动到矩阵乘法的另一侧:

rotMat = [cos(theta) sin(theta); -sin(theta) cos(theta)];  %# Rotation matrix
apparent = (obj.fixedPositions)*rotMat;  %# The result will be a 250-by-2 array

在绘制积分时,您应该利用handle graphics创建最流畅的动画。您可以使用绘图对象的句柄和SET命令来更新其属性,而不是删除旧的绘图并重新绘制它,这些属性应该更快地渲染。以下是使用SCATTER函数的示例:

h = scatter(apparent(:,1),apparent(:,2));  %# Make a scatter plot and return a
                                           %#   handle to the scattergroup object
%# Recompute new values for apparent
set(h,'XData',apparent(:,1),'YData',apparent(:,2));  %# Update the scattergroup
                                                     %#   object using set
drawnow;  %# Force an update of the figure window

答案 1 :(得分:3)

我认为您希望在乘以旋转之前和之后转置矩阵。如果矩阵是实数,您可以这样做:

apparent = ([cos(theta)  -sin(theta) ; sin(theta)  cos(theta)] * (obj.fixedPositions)')';