我有一组 5 个向量,我想从 Octave 中的每个其他向量中减去每个向量

问题描述 投票:0回答:2

所以,我希望能够对所有可能的组合减去 A-B、A-C、A-D...。理想情况下,这可以扩展到更大的向量集,以便可以快速计算差异。我一直在试图找出一个可能有效的 for 循环。

我对 Octave 的经验非常有限,而且我几乎不知道如何编码。有人鼓励我尝试编写一个 for 循环,但不太了解其动态。

for-loop vector octave
2个回答
0
投票

在 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
的第一列中)。


0
投票

您可以尝试的一件事是使用

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,只需将结果复制并加上负号即可。

© www.soinside.com 2019 - 2024. All rights reserved.