performance - 如何优化以下 Octave 双循环?

标签 performance optimization for-loop octave

我有以下 Octave 代码:

dist=0;
for i = 1:length(x);        
    for j = 1:length(y);
        v  = x(i,:) - y(j,:);
        distvect(j) = norm(v);
    endfor 
    dist = dist + min(distvect);
endfor

其中 x 和 y 是大小为 n x 2 和 m x 2 的矩阵。我的主要问题:我需要多次运行上面的代码。

我很确定有一种方法可以优化它,每次在内部 for 循环中可能只使用一个矩阵而不是 v 向量,但我找不到它。我上网查了一下,发现了一个arrayfun功能,这可能有帮助,但我不知道如何使用。

感谢您的帮助, 鹤

最佳答案

在这种情况下,您可以做出的最佳优化是自己实现范数以利用矩阵乘法,而不是循环遍历各个元素。

回想一下,对于向量值,norm(v) 计算 norm(v, 2),即欧几里得距离

norm(v, 2) = (sum (abs (v) .^ 2)) ^ (1/2)

由于您只需要找到最小距离,因此稍后实际上不需要取平方根。为了紧凑性,令 a = x(i, :)b = y(j, :)M = length(x)N = 长度(y)。由于您的变量 v 包含差异向量,因此我们可以将 distvect 的计算扩展为

distvect   = norm(v)
           = norm(x(i, :) - y(j, :))
           = norm(a - b)
           = (sum (abs( a - b ) .^ 2)) ^ (1/2)
distvect^2 = sum (abs ( a - b ) .^ 2)

现在,展开二次项,(a - b)^2 = a^2 - 2ab + b^2,这使得 abs 函数变得多余 p>

distvect^2 = sum (sum(a.*a) * ones(1,N) - 2*a*b' + ones(M,1) * sum(b'.*b') )

最后的优化,它将函数应用于多个值。这是通过使用 xy 矩阵的外积通过 length(y) 创建 length(x) 来完成的矩阵。然后取沿每列的最小距离并对结果求平方根

xx   = sum(x .* x, 2) * ones(1, length(y))
xy   = x * y'
yy   = ones(length(x), 1) * sum(y' .* y')

dist = sum(sqrt(min(xx - 2.*xy + yy)))

关于performance - 如何优化以下 Octave 双循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16656754/

相关文章:

linux - 如何获取 iostat 第二个样本

PHP - 解析和验证文本文件数据并将其导入mysql数据库

C++函数静态本地,性能?

linux - 如何在 linux 中循环一条语句

ios - 当 for 循环从 NSArray 到达 NSNotFound 时如何中断

java - 如何提高这段代码的速度?

mysql - SELECT 查询偶尔会执行很长时间

java - 创建对象使 VM 更快?

c++ - C++ 中复杂问题的手动矢量化/SSE

python - 我正在尝试使用 for 循环打印 .txt 文件的多行。它总是缺少最后三行