![](/img/trans.png)
[英]iOS — Determining whether Accelerate.framework is available at runtime
[英]iOS - Calculate the dot product of each row and/or column of a matrix using Accelerate.framework
我有两个矩阵变量(类型为float *
),分别称为matrixA
和matrixB
。 我需要计算的点积为每行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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.