C++ 将数字乘为矩阵

C++ 将数字乘为矩阵,c++,c,C++,C,有人能告诉我把一系列数字相乘成矩阵的最好方法是什么吗 我是说 我见过矩阵乘法的算法,但都是将数字乘以matrix1[4][4]和matrix2[4][4]。但是,我想将数字乘以matrix1[16]和matrix2[16] 是否有任何算法可以使用浮点数尽可能快地进行乘法 非常感谢你的帮助 编辑 我使用了cBLAS并做了一些速度测试,结果让我很惊讶 #include <stdio.h> #include <stdlib.h> #include <cblas.h>

有人能告诉我把一系列数字相乘成矩阵的最好方法是什么吗

我是说

我见过矩阵乘法的算法,但都是将数字乘以matrix1[4][4]和matrix2[4][4]。但是,我想将数字乘以matrix1[16]和matrix2[16]

是否有任何算法可以使用浮点数尽可能快地进行乘法

非常感谢你的帮助

编辑

我使用了cBLAS并做了一些速度测试,结果让我很惊讶

#include <stdio.h>
#include <stdlib.h>
#include <cblas.h>
#include  <GL/glfw.h>

    void matriz_matriz(float *matriz1,float *matriz2,float *matrizr){
      matrizr[0]  = (matriz1[0]*matriz2[0])+(matriz1[4]*matriz2[1])  +(matriz1[8]*matriz2[2])  +(matriz1[12]*matriz2[3]);
      matrizr[1]  = (matriz1[1]*matriz2[0])+(matriz1[5]*matriz2[1])  +(matriz1[9]*matriz2[2])  +(matriz1[13]*matriz2[3]);
      matrizr[2]  = (matriz1[2]*matriz2[0])+(matriz1[6]*matriz2[1])  +(matriz1[10]*matriz2[2]) +(matriz1[14]*matriz2[3]);
      matrizr[3]  = (matriz1[3]*matriz2[0])+(matriz1[7]*matriz2[1])  +(matriz1[11]*matriz2[2]) +(matriz1[15]*matriz2[3]);

      matrizr[4]  = (matriz1[0]*matriz2[4])+(matriz1[4]*matriz2[5])  +(matriz1[8]*matriz2[6])  +(matriz1[12]*matriz2[7]);
      matrizr[5]  = (matriz1[1]*matriz2[4])+(matriz1[5]*matriz2[5])  +(matriz1[9]*matriz2[6])  +(matriz1[13]*matriz2[7]);
      matrizr[6]  = (matriz1[2]*matriz2[4])+(matriz1[6]*matriz2[5])  +(matriz1[10]*matriz2[6]) +(matriz1[14]*matriz2[7]);
      matrizr[7]  = (matriz1[3]*matriz2[4])+(matriz1[7]*matriz2[5])  +(matriz1[11]*matriz2[6]) +(matriz1[15]*matriz2[7]);

      matrizr[8]  = (matriz1[0]*matriz2[8])+(matriz1[4]*matriz2[9])  +(matriz1[8]*matriz2[10]) +(matriz1[12]*matriz2[11]);
      matrizr[9]  = (matriz1[1]*matriz2[8])+(matriz1[5]*matriz2[9])  +(matriz1[9]*matriz2[10]) +(matriz1[13]*matriz2[11]);
      matrizr[10] = (matriz1[2]*matriz2[8])+(matriz1[6]*matriz2[9])  +(matriz1[10]*matriz2[10])+(matriz1[14]*matriz2[11]);
      matrizr[11] = (matriz1[3]*matriz2[8])+(matriz1[7]*matriz2[9])  +(matriz1[11]*matriz2[10])+(matriz1[15]*matriz2[11]);

      matrizr[12] = (matriz1[0]*matriz2[12])+(matriz1[4]*matriz2[13])+(matriz1[8]*matriz2[14]) +(matriz1[12]*matriz2[15]);
      matrizr[13] = (matriz1[1]*matriz2[12])+(matriz1[5]*matriz2[13])+(matriz1[9]*matriz2[14]) +(matriz1[13]*matriz2[15]);
      matrizr[14] = (matriz1[2]*matriz2[12])+(matriz1[6]*matriz2[13])+(matriz1[10]*matriz2[14])+(matriz1[14]*matriz2[15]);
      matrizr[15] = (matriz1[3]*matriz2[12])+(matriz1[7]*matriz2[13])+(matriz1[11]*matriz2[14])+(matriz1[15]*matriz2[15]);
    }


    int main(){
      int i;
      double tiempo1;
      double tiempo2;

      glfwInit();

      float *mat0 = NULL;
      float *mat1 = NULL;
      float *mat2 = NULL;

      mat0  = (float *)malloc(16 * sizeof(float));
      mat1  = (float *)malloc(16 * sizeof(float));
      mat2  = (float *)malloc(16 * sizeof(float));

      mat0[0]  =  1.0;
      mat0[1]  =  0.0;
      mat0[2]  =  0.0;
      mat0[3]  =  0.0;
      mat0[4]  =  0.0;
      mat0[5]  =  1.0;
      mat0[6]  =  0.0;
      mat0[7]  =  0.0;
      mat0[8]  =  0.0;
      mat0[9]  =  0.0;
      mat0[10] =  1.0;
      mat0[11] =  0.0;
      mat0[12] =  3.281897;
      mat0[13] =  4.714289;
      mat0[14] =  5.124306;
      mat0[15] =  1.0;

      mat1[0]  =  1.0;
      mat1[1]  =  0.0;
      mat1[2]  =  0.0;
      mat1[3]  =  0.0;
      mat1[4]  =  0.0;
      mat1[5]  =  0.924752;
      mat1[6]  =  0.380570;
      mat1[7]  =  0.0;
      mat1[8]  =  0.0;
      mat1[9]  = -0.380570;
      mat1[10] =  0.924752;
      mat1[11] =  0.0;
      mat1[12] =  0.0;
      mat1[13] =  0.0;
      mat1[14] =  0.0;
      mat1[15] =  1.0;

      mat2[0]  =  1.0;
      mat2[1]  =  0.0;
      mat2[2]  =  0.0;
      mat2[3]  =  0.0;
      mat2[4]  =  0.0;
      mat2[5]  =  1.0;
      mat2[6]  =  0.0;
      mat2[7]  =  0.0;
      mat2[8]  =  0.0;
      mat2[9]  =  0.0;
      mat2[10] =  1.0;
      mat2[11] =  0.0;
      mat2[12] =  0.0;
      mat2[13] =  0.0;
      mat2[14] =  0.0;
      mat2[15] =  1.0;

       tiempo1 = glfwGetTime();

       for(i=0;i<100000;i++){
        matriz_matriz(mat0,mat1,mat2);
        //cblas_sgemm(CblasRowMajor,CblasNoTrans,CblasNoTrans,4,4,4,1.0f,mat0,4,mat1,4,0.0f,mat2,4);
       }

      tiempo2 = glfwGetTime();
      printf("Tiempo total: %f\n",tiempo2-tiempo1);

      for(i=0;i<16;i++)printf("valor[%i]: %f\n",i,mat2[i]);

      free(mat0);
      free(mat1);
      free(mat2);

      system("pause");

      glfwTerminate();
      return 0;
    }
#包括
#包括
#包括
#包括
void matriz_matriz(float*matriz1,float*matriz2,float*matrizr){
matrizr[0]=(matriz1[0]*matriz2[0])+(matriz1[4]*matriz2[1])+(matriz1[8]*matriz2[2])+(matriz1[12]*matriz2[3]);
matrizr[1]=(matriz1[1]*matriz2[0])+(matriz1[5]*matriz2[1])+(matriz1[9]*matriz2[2])+(matriz1[13]*matriz2[3]);
matrizr[2]=(matriz1[2]*matriz2[0])+(matriz1[6]*matriz2[1])+(matriz1[10]*matriz2[2])+(matriz1[14]*matriz2[3]);
matrizr[3]=(matriz1[3]*matriz2[0])+(matriz1[7]*matriz2[1])+(matriz1[11]*matriz2[2])+(matriz1[15]*matriz2[3]);
matrizr[4]=(matriz1[0]*matriz2[4])+(matriz1[4]*matriz2[5])+(matriz1[8]*matriz2[6])+(matriz1[12]*matriz2[7]);
matrizr[5]=(matriz1[1]*matriz2[4])+(matriz1[5]*matriz2[5])+(matriz1[9]*matriz2[6])+(matriz1[13]*matriz2[7]);
matrizr[6]=(matriz1[2]*matriz2[4])+(matriz1[6]*matriz2[5])+(matriz1[10]*matriz2[6])+(matriz1[14]*matriz2[7]);
matrizr[7]=(matriz1[3]*matriz2[4])+(matriz1[7]*matriz2[5])+(matriz1[11]*matriz2[6])+(matriz1[15]*matriz2[7]);
matrizr[8]=(matriz1[0]*matriz2[8])+(matriz1[4]*matriz2[9])+(matriz1[8]*matriz2[10])+(matriz1[12]*matriz2[11]);
matrizr[9]=(matriz1[1]*matriz2[8])+(matriz1[5]*matriz2[9])+(matriz1[9]*matriz2[10])+(matriz1[13]*matriz2[11]);
matrizr[10]=(matriz1[2]*matriz2[8])+(matriz1[6]*matriz2[9])+(matriz1[10]*matriz2[10])+(matriz1[14]*matriz2[11]);
matrizr[11]=(matriz1[3]*matriz2[8])+(matriz1[7]*matriz2[9])+(matriz1[11]*matriz2[10])+(matriz1[15]*matriz2[11]);
matrizr[12]=(matriz1[0]*matriz2[12])+(matriz1[4]*matriz2[13])+(matriz1[8]*matriz2[14])+(matriz1[12]*matriz2[15]);
matrizr[13]=(matriz1[1]*matriz2[12])+(matriz1[5]*matriz2[13])+(matriz1[9]*matriz2[14])+(matriz1[13]*matriz2[15]);
matrizr[14]=(matriz1[2]*matriz2[12])+(matriz1[6]*matriz2[13])+(matriz1[10]*matriz2[14])+(matriz1[14]*matriz2[15]);
matrizr[15]=(matriz1[3]*matriz2[12])+(matriz1[7]*matriz2[13])+(matriz1[11]*matriz2[14])+(matriz1[15]*matriz2[15]);
}
int main(){
int i;
双tiempo1;
双tiempo2;
glfwInit();
float*mat0=NULL;
float*mat1=NULL;
float*mat2=NULL;
mat0=(浮动*)malloc(16*sizeof(浮动));
mat1=(浮动*)malloc(16*sizeof(浮动));
mat2=(浮动*)malloc(16*sizeof(浮动));
mat0[0]=1.0;
mat0[1]=0.0;
mat0[2]=0.0;
mat0[3]=0.0;
mat0[4]=0.0;
mat0[5]=1.0;
mat0[6]=0.0;
mat0[7]=0.0;
mat0[8]=0.0;
mat0[9]=0.0;
mat0[10]=1.0;
mat0[11]=0.0;
mat0[12]=3.281897;
mat0[13]=4.714289;
mat0[14]=5.124306;
mat0[15]=1.0;
mat1[0]=1.0;
mat1[1]=0.0;
mat1[2]=0.0;
mat1[3]=0.0;
mat1[4]=0.0;
mat1[5]=0.924752;
mat1[6]=0.380570;
mat1[7]=0.0;
mat1[8]=0.0;
mat1[9]=-0.380570;
mat1[10]=0.924752;
mat1[11]=0.0;
mat1[12]=0.0;
mat1[13]=0.0;
mat1[14]=0.0;
mat1[15]=1.0;
mat2[0]=1.0;
mat2[1]=0.0;
mat2[2]=0.0;
mat2[3]=0.0;
mat2[4]=0.0;
mat2[5]=1.0;
mat2[6]=0.0;
mat2[7]=0.0;
mat2[8]=0.0;
mat2[9]=0.0;
mat2[10]=1.0;
mat2[11]=0.0;
mat2[12]=0.0;
mat2[13]=0.0;
mat2[14]=0.0;
mat2[15]=1.0;
tiempo1=glfwGetTime();

对于(i=0;i老实说,如果你在做任何类型的线性代数,到目前为止,你最好的选择是使用专门设计的库,如BLAS、LAPACK等。你将很难用自己的代码达到它们的速度


矩阵运算是BLAS级别3,您需要的特殊运算是
SGEMM()
用于
float
s和
DGEMM()
用于
double
s。英特尔硬件上最快的BLAS实现是OpenBLAS(源自GotoBLAS)和英特尔MKL(数学内核库)中的BLAS实现.ATLAS也非常快,如果你自己编译它。

老实说,如果你在做任何类型的线性代数,到目前为止,你最好的选择是使用专门设计的库,如BLAS、LAPACK等。你将很难用自己的代码接近它们的速度


矩阵运算是BLAS级别3,您需要的特殊运算是
SGEMM()
用于
float
s和
DGEMM()
用于
double
s。英特尔硬件上最快的BLAS实现是OpenBLAS(源自GotoBLAS)和英特尔MKL(数学内核库)中的BLAS实现.ATLAS也非常快,如果您自己编译的话。

2 x 2矩阵的版本(基于):

#包括
使用名称空间std;
int main()
{
const int rows=2;
常数int cols=2;
浮点数a[4]={1,2,3,4};
浮点数b[4]={1,2,3,4};
浮点数c[4]={0,0,0,0};

对于(int i=0;i2 x 2矩阵的版本(基于):

#包括
使用名称空间std;
int main()
{
const int rows=2;
常数int cols=2;
浮点数a[4]={1,2,3,4};
浮点数b[4]={1,2,3,4};
浮点数c[4]={0,0,0,0};

对于(int i=0;i)类乘法(按元素)或实际矩阵乘法(matr的结果)
#include<iostream>
using namespace std;

int main()
{
    const int rows = 2;
    const int cols = 2;

    float a[4]={1,2,3,4};
    float b[4]={1,2,3,4};
    float c[4]={0,0,0,0};

    for (int i = 0; i <rows; i++) {
        for (int j = 0; j <cols; j++) 
        {   
            float sum = 0.0;
            for (int k = 0; k < rows; k++)
                sum = sum + a[i * cols + k] * b[k * cols + j]; 
            c[i * cols + j] = sum;
        }   
    }   
    for (int ix =0; ix <4; ++ix)
            cout << c[ix] << ' ';

}