改变矢量的大小



我正在尝试从数组中的向量中扩展或减去幅度。调用函数的代码是:

v_set = {[1;0],[0;2],[1;1]};
v_extensions = [1,-.5,1];
v_set_extended = vector_set_extend(v_set, v_extensions);

函数本身如下。我将x和y的大小相加,但如果有意义的话,我希望它将向量指向的方向的大小相加。

function v_set_extended = vector_set_extend(v_set,v_extensions)
% Takes a set of vectors and a set of lengths by which to extend them.
% Returns a set of extended vectors
%
% Inputs: 
%
%   v_set: a cell array, each element of which is a vector
%
%   v_extensions: a vector of the same dimensions as v_set, containing
%       lengths which should be added to the vectors
%
% Outputs:
%
%   v_set_extended: cell array of the same size as v_set, each element of
%       which is the vector with its new length
%%%%%%%%
% Use the 'cell' and 'size' commands to create the output
% v_set_extended as an empty cell of the same size as v_set
v_set_extended = cell(size(v_set))

%%%%%%%%
% Loop over the vectors and extensions, adding the extension to the
% length of the vector, and then storing the result in the
% corresponding entry of v_set_extended
for idx = 1:numel(v_set_extended)
v_set_extended{idx} = v_set{idx}+v_extensions(idx);
end
end

这主要是一个三角问题。你有一个向量,我们称之为v,它有分量v_xv_y。现在假设您想将w添加到向量的大小上。

v的大小为sqrt(v_x^2 + v_y^2),角度为theta = tan(v_y/v_x)。然后,您要做的是创建一个大小为m = sqrt(v_x^2 + v_y^2) + w但方向相同的新矢量。一旦知道了新的幅度,角度就相同了,矢量的新分量是v1_x = m*cos(theta)v1_y = m*sin(theta)

实现这一点应该没有任何问题,只需注意Matlab中sin/sind之间的区别。

解决方案相当简单,但由于使用的是单元数组,因此更为复杂。请避免使用单元格数组,尽可能使用普通数组。因此,首先我们将v_set转换为一个矩阵:

v_mat = cell2mat(v_set)

然后,要扩展向量,以便将新向量的大小扩展某个值。首先计算矢量的幅度:

mag_v_mat = vecnorm(v_mat);

最后一次制造新的矢量:

v_extended = v_mat.*(mag_v_mat+v_extensions)./mag_v_mat;

点运算符用于沿向量对运算进行矢量化。

在一行中,它可以写为:

v_extended = cell2mat(v_set).*(1+v_extensions./vecnorm(cell2mat(v_set)));

请参阅注释进行解释,坚持当前结构的简单方法是只计算一个单位向量并对其进行缩放,而不是直接添加扩展。。。

for idx = 1:numel(v_set_extended)
% Compute the unit vector (magnitude 1) in the same direction
uvec = v_set{idx} / vecnorm(v_set{idx});
% Create a vector of the extension length in the unit direction
ext = uvec * v_extensions(idx);
% Add the extension
v_set_extended{idx} = v_set{idx} + ext;
end

您可以通过验证vecnorm(幅度(值来对此进行健全性检查

cellfun( @vecnorm, v_set )          % = [1, 2.0, 1.4142]
cellfun( @vecnorm, v_set_extended ) % = [2, 1.5, 2.4142]
% difference = [1,-0.5, 1]

相关内容

  • 没有找到相关文章

最新更新