---
title: MatMul
description: "使用两个输入张量a和b以及参数结构体M，执行两个矩阵之间的乘法运算，将计算结果存储于输出张量output。例如："
url: https://www.hikunpeng.com/document/detail/zh/boostsra/srainference/SRA_Inference/kunpengsra_inference_16_0027.html
sourcePath: /source/zh/boostsra/srainference/SRA_Inference/kunpengsra_inference_16_0027.html
indexId: 74d3c8a11281093825d3fd35c3640a192c7daf80e783a747ebe0aeb8d5b986da80
---
# MatMul

#### 场景说明

使用两个输入张量a和b以及参数结构体M，执行两个矩阵之间的乘法运算，将计算结果存储于输出张量output。例如：

```
a: [1,2,
    3,4]
b: [5,6,
    7,8]
output: [19,22,
         43,50]
```


#### 代码示例

```
#include <cmath>
#include <random>
#include <cstdint>
#include <iostream>

#include "ktfop.h"
int main()
{
    using namespace ktfop;
    MatMulParams<float> params;
    params.order = CblasRowMajor;     //矩阵存储顺序(行优先or列优先)
    params.transA = CblasNoTrans;     //A矩阵是否转置
    params.transB = CblasNoTrans;     //B矩阵是否转置
    params.m = 2;                     //A矩阵的行数
    params.n = 2;                     //B矩阵的列数
    params.k = 2;                     //A矩阵的列数或B矩阵的行数    
    params.alpha = 1.0f;              //alpha参数
    params.lda = 2;                   //A矩阵存储步长
    params.ldb = 2;                   //B矩阵存储步长
    params.beta = 0.0f;               //beta参数
    params.ldc = 2;                   //C矩阵存储步长
    float a[4] = {1, 2, 3, 4};        //初始化参与计算的矩阵
    float b[4] = {5, 6, 7, 8};
    float c[4] = {0, 0, 0, 0};        //保存计算结果的矩阵
    int ret = -1;
    ret = Matmul(a, b, c, params);    //调用Matmul算子，结果存储于c数组
    std::cout << "c: [";
    for (int i = 0; i < 4; ++i) {
        std::cout << c[i];
        if (i < 3) {
            std::cout << ", ";
        }
    }
    std::cout << "]" << std::endl;
    ret = Matmul(static_cast<float *>(nullptr), b, c, params); //传入空指针，打印日志"ERROR Parameter verification failed for the MatMul Op."
    ret = Matmul(a, b, static_cast<float *>(nullptr), params); //传入空指针，打印日志"ERROR Parameter verification failed for the MatMul Op."
}
```
