mkl实现矩阵不同列扩大不同倍数
MKL可以使用矩阵乘法函数cblas_dgemm()来实现矩阵扩大不同列的功能。具体步骤如下:
- 定义原始矩阵
A和列扩大倍数矩阵B,并计算出扩大后的矩阵C的列数。
double A[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
double B[4] = {1, 2, 3, 4};
int m = 3, n = 4, p = 0;
for (int i = 0; i < n; i++) {
p += B[i];
}
double C[m][p];
- 将
A和B转换为按列存储的一维数组,以便使用cblas_dgemm()函数。
double *a = (double*)malloc(sizeof(double) * m * n);
double *b = (double*)malloc(sizeof(double) * n);
double *c = (double*)malloc(sizeof(double) * m * p);
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
a[i * n + j] = A[i][j];
}
}
for (int i = 0; i < n; i++) {
b[i] = B[i];
}
- 调用
cblas_dgemm()函数进行矩阵乘法,将结果保存在C矩阵中。
cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, m, p, n, 1, a, n, b, 1, 0, c, p);
- 将结果矩阵
C转换回二维数组形式。
for (int i = 0; i < m; i++) {
for (int j = 0; j < p; j++) {
C[i][j] = c[i * p + j];
}
}
完整代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <mkl.h>
int main()
{
double A[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
double B[4] = {1, 2, 3, 4};
int m = 3, n = 4, p = 0;
for (int i = 0; i < n; i++) {
p += B[i];
}
double C[m][p];
double *a = (double*)malloc(sizeof(double) * m * n);
double *b = (double*)malloc(sizeof(double) * n);
double *c = (double*)malloc(sizeof(double) * m * p);
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
a[i * n + j] = A[i][j];
}
}
for (int i = 0; i < n; i++) {
b[i] = B[i];
}
cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, m, p, n, 1, a, n, b, 1, 0, c, p);
for (int i = 0; i < m; i++) {
for (int j = 0; j < p; j++) {
C[i][j] = c[i * p + j];
}
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < p; j++) {
printf("%.2f ", C[i][j]);
}
printf("\n");
}
free(a);
free(b);
free(c);
return 0;
}
``
原文地址: https://www.cveoy.top/t/topic/fIOH 著作权归作者所有。请勿转载和采集!