所以,我希望能够对所有可能的组合减去 A-B、A-C、A-D...。理想情况下,这可以扩展到更大的向量集,以便可以快速计算差异。我一直在试图找出一个可能有效的 for 循环。
我对 Octave 的经验非常有限,而且我几乎不知道如何编码。有人鼓励我尝试编写一个 for 循环,但不太了解其动态。
在 Octave 中,除了将向量放入可索引的 2D 数组中之外,您别无选择。然后结果可以存储在 3D 数组中:
X = [A(:) , B(:) , C(:) , D(:) , E(:)];
Y = zeros(size(X,1),size(X,2),size(X,2));
for j = 1:size(X,2)
for k = 1:size(X,2)
Y(:,i,j) = X(:,i) - Y(:,j);
end
end
Y(:,i,j)
是第i个向量与第j个向量相减的结果
请注意,向量可以被称为
A(:)
或简称为 A
,但这里有一个微妙的区别:Octave/Matlab 在列向量和行向量之间存在差异,具体取决于它们的定义/分配/创建方式。因此,根据上下文,A
可以是列或行。相反,A(:)
始终是一个列向量(在上面的代码中,它被放置在矩阵X
的第一列中)。
您可以尝试的一件事是使用
nchoosek
函数生成索引“对”,然后使用这些索引来索引向量数组(或元胞数组)以获得它们的差异。例如
Vectors = [10, 20, 30, 40; 20, 30, 40, 50; 30, 40, 50, 60; 40, 50, 60, 70];
IndexPairs = nchoosek( 1:4, 2 ).';
Diffs = zeros( size( Vectors, 1), size( IndexPairs, 2 ) );
for i = 1 : size( IndexPairs, 2 )
Diffs(:, i) = Vectors(:, IndexPairs(1, i)) - Vectors(:, IndexPairs(2, i))
endfor
注意:这只会给您带来一个方向的差异。如果您想要 B-A 等 2,只需将结果复制并加上负号即可。