Xcode Mac C++ vDSP_mmul 返回不同的结果

问题描述 投票:0回答:1

使用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;

https://i.stack.imgur.com/Da3Ju.jpg

c++ xcode c++17 accelerate-framework
1个回答
0
投票

根据 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);
© www.soinside.com 2019 - 2024. All rights reserved.