使用XCODE -std=c++17,Accelerate Framework包含在项目中。
vDSP_mmul(const float* Nonnull A,vDSP_Stride IA,const float* Nonnull B,vDSP_Stride IB, float *Nonnull C,vDSP_Stride IC)
MatC 中存储的结果无法正确计算出正确的 2by4 矩阵。
matrixA - height stride == 3
matrixB - height stride == 4
matc - height stride = 4
知道出了什么问题吗?
#include <vecLib/vDSP.h>
#include <Accelerate/Accelerate.h>
#define XXX __asm__("nop")
float matrixA[2][3] {
{18.237,15.213,20.393},
{20.13,17.392,18.82}
};
float matrixB[3][4]{
{17.145,9.32,15.238,20.763},
{2.173,9.13,8.34,9.23},
{1.33,8.32,15.23,6.182}
};
float matC[2][4] {
{1.0f,1.0f,1.0f,1.0f},
{1.0f,1.0f,1.0f,1.0f}
};
XXX;
vDSP_mmul((const float*)&matrixA[0][0],3,(const float*)&matrixB[0][0],4,(float*)&matC[0][0],4,2,3,2);
XXX;
根据 vDSP_mmul 文档,每个地址后面的参数是数组的步长。这是要跳过的物理元素的数量。当您想要对矩阵进行面向列的遍历时,可以使用它。对于普通操作,请使用步幅 1。
倒数第三个参数是矩阵 A 和 C 中的行数。即您所拥有的 2。
倒数第二个参数是矩阵 B 和 C 中的列数。即 4,而不是您拥有的 3。
您不需要转换地址,因为例如,
matrixA[0][0]
已经是float *
。并且您不需要包含 <vecLib/vDSP.h>
;包括 <Accelerate/Accelerate.h>
就足够了。
vDSP_mmul
呼叫可以是:
vDSP_mmul(
&matrixA[0][0], 1,
&matrixB[0][0], 1,
&matC[0][0], 1,
2, 4, 3);