题目
给定两个同维度的三维向量 u 与 v,分别利用矩阵乘法 <code>u * v'</code> 与内置函数 <code>dot(u, v)</code> 计算它们的数量积(点积),并求出两向量夹角的余弦值及夹角(角度)。
输入格式:无需外部输入。
输出格式:输出内积、模长、夹角余弦与夹角角度(度数)。
数据范围与约定:三维实数向量。
思路与算法
1. 点积几何定义
$\vec{u} \cdot \vec{v} = |\vec{u}| |\vec{v}| \cos(\theta) = \sum u_i v_i$。
2. 矩阵乘法与 dot
若 u, v 均为 1×N 行向量,内积写为 u * v';使用 dot(u, v) 则不要求行列形态严格对称,但要求长度必须相同。
3. 夹角反余弦反求
$\cos(\theta) = \frac{\vec{u} \cdot \vec{v}}{\|\vec{u}\|_2 \|\vec{v}\|_2}$。使用 acos() 得到弧度值,乘 $180/\pi$ 转为角度。注意由于浮点误差可能算出 1.00000000002,在 acos 前最好用 max(min(cos_theta, 1), -1) 截断防止产生虚部。
完整程序
% Octave / MATLAB 第20题:向量点积与夹角计算
u = [1, 2, 3];
v = [4, 5, 6];
% 1. 点积计算 (两种方法比对)
dot_manual = u * v';
dot_func = dot(u, v);
% 2. 模长计算
norm_u = norm(u);
norm_v = norm(v);
% 3. 夹角计算 (考虑浮点防溢截断)
cos_val = dot_func / (norm_u * norm_v);
cos_clamped = max(min(cos_val, 1.0), -1.0);
rad = acos(cos_clamped);
deg = rad * (180 / pi);
fprintf("向量 u: %s | 模长: %.4f\n", mat2str(u), norm_u);
fprintf("向量 v: %s | 模长: %.4f\n", mat2str(v), norm_v);
fprintf("内积 dot: %.4f\n", dot_func);
fprintf("夹角余弦 cos(theta): %.4f\n", cos_clamped);
fprintf("夹角角度 theta: %.2f deg\n", deg);运行示例
输出:
向量 u: [1 2 3] | 模长: 3.7417
向量 v: [4 5 6] | 模长: 8.7750
内积 dot: 32.0000
夹角余弦 cos(theta): 0.9746
夹角角度 theta: 12.93 deg