我正在尝试从数组中的向量中扩展或减去幅度。调用函数的代码是:
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_x
,v_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]