gpt4 book ai didi

iOS - 使用 Accelerate.framework 计算矩阵每一行和/或列的点积

转载 作者:行者123 更新时间:2023-11-29 12:49:36 27 4
gpt4 key购买 nike

我有两个矩阵变量(float * 类型),称为matrixAmatrixB。我需要计算 matrixA 的每一行和 matrixB 的每一列的点积。我正在努力使它尽可能快,所以我转向 iOS 中的 Accelerate.framework

我发现我可以遍历 matrixA 的每一行并使用 Accelerate.framework 方法 vDSP_svesq() 计算总和它的输入向量的平方(在这种情况下与点积相同)。在我的例子中,输入向量将是我循环遍历的矩阵的每一行。

对于 matrixB 我相信我可以通过使用相同的 vDSP_svesq() 函数并包含一个 stride 值来计算每列的点积等于矩阵中的列数。

我的问题是:有什么方法可以避免遍历每一行并计算每一行的点产品?是否有一种 Accelerate.framework 方法可以计算每个矩阵行和/或列的点积,而不强制我在循环中这样做?

Accelerate.framework 的文档对我来说真的很难理解。我正在尝试,但是...

如有任何指点,我们将不胜感激。

最佳答案

你问的不是很清楚。点积将两个向量作为参数,但您一直在谈论“每个 [向量] 的点积。”

认为您要求的是一种计算每一行[或列]与其自身的点积的方法,即 l2 范数平方每行[或产品]。结果将是一个向量,其第 i 项由下式给出:

result_i = sum_{j=0}^{j<n} A_ij * A_ij

如果这确实是您要计算的内容,那么在每一行上调用 vDSP_svesq 是一个非常合理的解决方案。

但是,为了计算列的范数平方,我建议采用不同的解决方案。如果您尝试使用 vDSP_svesq 来做到这一点,正如您所指出的,您将需要非单位步幅,这几乎会破坏您的性能。相反,您可以执行以下操作:

void normsSquaredOfColumns(float *result, const float * restrict matrix,
int rows, int cols) {
// initialize result with squares of the first row.
vDSP_vsq(matrix, 1, result, 1, cols);
// loop over rows, adding square of each to the result.
for (int row=1; row<rows; ++row)
vDSP_vma(&matrix[i*cols], 1, &matrix[i*cols], 1, result, 1, result, 1, cols);
}

关于iOS - 使用 Accelerate.framework 计算矩阵每一行和/或列的点积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22733059/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com