提问人:Michaela Schnell 提问时间:10/27/2023 更新时间:10/27/2023 访问量:35
我有一组 5 个向量,我想从 Octave 中的每个其他向量中减去每个向量
I have a set of 5 vectors and I want to subtract each vector from every other vector in Octave
问:
所以,我希望能够减去 A-B、A-C、A-D......适用于所有可能的组合。理想情况下,这可以扩展到更大的向量集,以便可以快速计算差异。我一直在试图找出一个可能有效的for循环。
我对八度音程的经验非常有限,而且我几乎不知道如何编码。我被鼓励尝试编写一个for循环,但不太了解其中的动态。
答:
1赞
PierU
10/27/2023
#1
在 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(:,k,j) = X(:,k) - X(:,j);
end
end
Y(:,i,j)
是第 j 个向量与第 i 个向量的减去结果
请注意,向量可以称为 或简单地称为 ,但这里有一个微妙的区别:Octave/Matlab 在列向量和行向量之间有区别,具体取决于它们的定义/赋值/创建方式。因此,根据上下文的不同,可以是列或行。相反,始终是一个列向量(在上面的代码中放在矩阵的第一列中)。A(:)
A
A
A(:)
X
评论
0赞
Cris Luengo
10/27/2023
如果置换为大小 [5,1,n] 和大小 [1,5,n](其中 n 是 的长度),则可以直接减去这两者,并跳过循环。X
A
0赞
PierU
10/27/2023
@CrisLuengo我假设你依赖一些广播?在某些情况下,它可能更有效,但除了非常简单的情况外,我发现代码很难在事后阅读。
1赞
Tasos Papastylianou
10/27/2023
#2
您可以尝试的一件事是生成索引的“对”函数,然后使用这些索引对向量数组(或元胞数组)进行索引以获得它们的差异。例如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 等两个,只需用负号复制结果即可。
评论