You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Octave中批量计算多向量间的两两差值?

Octave计算所有两两向量差值的方案

1. 先把向量整理成矩阵

首先把你的所有向量(不管是5个还是更多)统一放到一个矩阵里,这样方便批量处理:

  • 如果你的向量是列向量(比如A = [1;2;3]),就把它们作为列拼起来:
% 示例:定义5个3维列向量
A = [1; 2; 3];
B = [4; 5; 6];
C = [7; 8; 9];
D = [10; 11; 12];
E = [13; 14; 15];

% 拼成矩阵V,每一列对应一个原始向量
V = [A, B, C, D, E];
  • 如果你的向量是行向量(比如A = [1 2 3]),就把它们作为行拼起来:
V = [A; B; C; D; E];

2. 用广播快速计算所有两两差值(无需循环)

Octave的广播功能可以帮你跳过复杂循环,直接批量计算所有组合。下面的代码会生成一个三维数组,包含所有向量i - 向量j的结果:

% 针对列向量组成的V,生成n行×m列×m页的三维数组(n是向量维度,m是向量个数)
diff_all = V(:, :, ones(1, size(V,2))) - V(:, ones(1, size(V,2)), :);
  • 结果说明:diff_all(:, i, j)就是第i个向量减去第j个向量的结果(比如diff_all(:,1,2)对应A-B,diff_all(:,1,3)对应A-C)
  • 如果是行向量组成的V,只需要调整维度:
diff_all = V(ones(1, size(V,1)), :, :) - V(:, :, ones(1, size(V,1)));

3. 可选:把结果整理成直观的矩阵形式

如果觉得三维数组看着麻烦,可以把它展开成二维矩阵,每一列对应一个两两差值:

% 列向量V的情况:展开后每一列是一个差值向量
diff_flat = reshape(diff_all, size(V,1), []);

4. 扩展到更多向量

后续新增向量时,只需要把向量添加到矩阵V中即可,比如新增向量F:

V = [V, F]; % 列向量的情况
% 或者 V = [V; F]; % 行向量的情况

然后重新运行计算diff_all的代码,就能自动计算所有新的两两组合,完全不用修改核心逻辑。

新手友好:用循环理解计算逻辑

如果想搞懂循环的运行机制,这里给一个简单的双循环示例,逻辑和上面的广播方法完全一致:

m = size(V,2); % 获取向量的总个数
n = size(V,1); % 获取每个向量的维度
diff_all = zeros(n, m, m); % 预先分配存储空间,提升效率

% 外层循环遍历被减的向量i,内层循环遍历减数向量j
for i = 1:m
    for j = 1:m
        diff_all(:, i, j) = V(:,i) - V(:,j);
    end
end

内容的提问来源于stack exchange,提问作者Michaela Schnell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 11:52:20