繁体   English   中英

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

[英]iOS - Calculate the dot product of each row and/or column of a matrix using Accelerate.framework

我有两个矩阵变量(类型为float * ),分别称为matrixAmatrixB 我需要计算的点积为每行matrixA和每一列matrixB 我试图使其尽可能快,所以我转向iOSAccelerate.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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM