精华内容
参与话题
问答
  • python 矩阵乘法

    万次阅读 多人点赞 2019-02-09 13:55:54
    python 矩阵乘法 python 矩阵有两种形式:array 和 matrix 对象(它们的区别在这里就不说了),下面介绍相关乘法 1. np.multiply 对 array 和 matrix 对象的操作相同 (1) a 和 b 维度相同 都是每行对应元素相乘...

    python 矩阵乘法


    python 矩阵有两种形式:array 和 matrix 对象(它们的区别在这里就不说了),下面介绍相关乘法

    1. np.multiply

    对 array 和 matrix 对象的操作相同
    (1) a 和 b 维度相同
    都是每行对应元素相乘(即对应内积的第一步,不求和)

    >>> a = np.array([[1,2],[1,2]])
    >>> a*a
    >>> array([[1, 4],
           [1, 4]])
    

    (2)对于两个矩阵元素 a 和 b 维度不一的情况(array 和 matrix 对象都适用),则需将相应的行和列进行扩充,需要扩充的行或列的维度必须为 1。
    对列扩充则补 1, 对行扩充则将第一行复制到每一行。比如,a:3 * 1, b: 1 * 2,则 a 扩充为 3 * 2,b 扩充为 3 * 2。
    如下所示:

    >>> a = np.array([[1],[1],[1]])
    >>> b = np.array([1,2])
    >>> np.multiply(a, b)
    >>> array([[1, 2],
           [1, 2],
           [1, 2]])
    

    (3)a 和 b为标量:则标量直接相乘

    2. *
    (1)对于 matrix 对象,代表矩阵乘法(维度必须满足相应规则);
    (2)对于array对象,则是每行对应元素相乘。当 array 对象的 shape 不同时(matrix 对象不行) ,其规则和 np.multiply 一样;

    3. np.matmul
    该函数对 array 和 matrix 对象的操作是不一样的。
    (1)对于 matrix 对象,对应矩阵乘法,对象维度必须满足矩阵乘法规则。
    (2)对于 array 对象,对应内积,但对象维度必须相同,不支持维度扩展。
    (3)不支持标量运算。

    在array 中,与 multiply 一样,每行对应元素相乘
    4. np.dot
    对于matrix 对象,对应矩阵乘法。
    对于两个 array 类型的元素:a,b,有如下可能:
    (1)a 和 b 都是一维 array,那么 dot 就是它们的内积(点乘);
    (2)a 和 b 都是二维 array,那么 dot 就是它们的矩阵乘积(即按矩阵乘法规则来计算),也可以用 matmul 或 a @ b;
    (3)如果a 和 b 都是标量(scalar),那么 dot 就是两个数的乘积,也可以用 multiply 或 a * b;
    (4)若 a:N * D,b:1 * D,那么 dot 为 a 的每一行和 b (只有一行)的 内积;

    >>>a = np.array([[1,2], [3, 4]])
    >>>b = np.array([1, 2])
    >>>np.dot(a, b)
    >>>array([ 5, 11])
    

    以上的总结并不完善,如果有错欢迎指出,谢谢。

    展开全文
  • 矩阵乘法

    千次阅读 2019-02-16 09:27:22
    矩阵乘法(Matrix multiplication)最重要的方法是一般矩阵乘积。它只有在第一个矩阵的列数(column)和第二个矩阵的行数(row)相同时才有意义。一般单指矩阵乘积时,指的便是一般矩阵乘积。一个m×n的矩阵就是m×n...

    矩阵乘法(Matrix multiplication)最重要的方法是一般矩阵乘积。它只有在第一个矩阵的列数(column)和第二个矩阵的行数(row)相同时才有意义。一般单指矩阵乘积时,指的便是一般矩阵乘积。一个m×n的矩阵就是m×n个数排成m行n列的一个数阵。由于它把许多数据紧凑的集中到了一起,所以有时候可以简便地表示一些复杂的模型。

    定义

    A为  的矩阵,B为  的矩阵,那么称  的矩阵C为矩阵AB的乘积,记作  ,其中矩阵C中的第 行第 

    列元素可以表示为:

    如下所示:

    注意事项

    1、当矩阵A的列数(column)等于矩阵B的行数(row)时,A与B可以相乘。

    2、矩阵C的行数等于矩阵A的行数,C的列数等于B的列数。

    3、乘积C的第m行第n列的元素等于矩阵A的第m行的元素与矩阵B的第n列对应元素乘积之和。

    基本性质

    1. 乘法结合律: (AB)C=A(BC)

    2. 乘法左分配律:(A+B)C=AC+BC 

    3. 乘法右分配律:C(A+B)=CA+CB 

    4. 对数乘的结合性k(AB)=(kA)B=A(kB).

    5. 转置 (AB)T=BTAT.

    6. 矩阵乘法一般不满足交换律 [3]  。

      *注:可交换的矩阵是方阵。

    乘积-哈达马积( hadamard product)

    矩阵  与 矩阵  的Hadamard积记为  。其元素定义为两个矩阵对应元素的乘积  

    m×n矩阵 [2]  。例如,

    乘积-克罗内克乘积

    Kronecker积是两个任意大小的矩阵间的运算,表示为 。克罗内克积也被称为直积张量积,以德国数学家利奥波德·克罗内克命名。计算过程如下例所示:

    展开全文
  • 矩阵转置与矩阵相乘

    万次阅读 2016-09-13 22:24:11
    1.转置矩阵1.1转置矩阵简介把矩阵A的行换成同序数的列得到的新矩阵,叫做A的转置矩阵(Transpose of a Matrix),记作ATA^T。 例如: 因此,转置矩阵的特点: (1)转置矩阵的行数是原矩阵的列数,转置矩阵的列数是...

    前言

    写这篇博客的原因是为了记录一下矩阵转置与矩阵相乘的实现代码,供日后不时之需。直接原因是今晚(2016.09.13)参加了百度 2017 校招的笔试(C++岗),里面就有一道矩阵转置后相乘的在线编程题。考虑到日后笔试可能会用到,特此记录,也希望能够帮助到需要的网友。

    今晚的百度笔试还有一个道求矩形方格中房子的数量,可以用类似于求迷宫中寻找可行路径的深度优先搜索(DFS)加回溯法来求解,幸好之前研究过迷宫问题并记录下来写成博客,要不然,又悲剧了,短时间内很难写出那么多代码!

    1.矩阵转置

    1.1 简介

    把矩阵 A 的行换成同序数的列得到的新矩阵,叫做 A 的转置矩阵(Transpose of a Matrix),记作 ATA^TAT

    例如:
    这里写图片描述
    因此,转置矩阵的特点:
    (1)转置矩阵的行数等于原矩阵的列数,转置矩阵的列数等于原矩阵的行数;
    (2)转置矩阵下标(i,j)的元素对应于原矩阵下标(j,i)的元素。

    1.2 实现

    使用二维数组作为矩阵的存储结构,根据转置矩阵的特点,很容易得到转置矩阵。

    /**************************************************
    *@para:matrix:原矩阵;row:矩阵行数;column:矩阵列数
    *@ret:返回转置矩阵
    **************************************************/
    int** getTransposeMatrix(int** matrix,int row,int column){
       int** matrixR=new int*[columns];
       for(int i=0;i<columns;++i){
            matrixR[i]=new int[rows];
       }
       
       for(int i=0;i<row;++i){
            for(int j=0;j<column;++j){
                matrixR[j][i]=matrix[i][j];
            }
       }
       return matrixR;
    }
    

    2.矩阵相乘

    2.1 简介

    设 A 为 m×pm\times pm×p 的矩阵,B 为 p×np\times np×n 的矩阵,那么称 m×nm\times nm×n 的矩阵 C 为矩阵 A 与 B 的乘积,记作 C=AB ,其中矩阵 C 中的第 i 行第 j 列元素可以表示为:
    这里写图片描述

    示例如下:
    这里写图片描述

    矩阵相乘的特点:
    (1)当矩阵 A 的列数等于矩阵 B 的行数时,A 与 B 才可以相乘。
    (2)乘积 C 的第 m 行第 n 列的元素等于矩阵 A 的第 m 行的元素与矩阵 B 的第 n 列对应元素乘积之和。
    (3)矩阵 C 的行数等于矩阵 A 的行数,C 的列数等于 B 的列数。

    2.2 示例代码

    /********************************************
    *@para:A:矩阵A;B:矩阵B;C:相乘结果矩阵;rowA:A的行数;columnB:B的列数;columnA:A的列数
    *@ret:void 
    ********************************************/
    void matrixMul(int **A, int **B, int **C, int rowA, int columnB, int columnA){
        for (int i=0;i<rowA;i++){
            for (int j=0; j<columnB;j++){
                C[i][j] = 0;
                for (int k=0;k<columnA;k++){
                    C[i][j]+=A[i][k]*B[k][j];
                }
             }
         }
    }
    

    参考文献

    [1] 转置矩阵 百度百科
    [2] 矩阵乘法 百度百科

    展开全文
  • 矩阵乘法(两个矩阵相乘

    千次阅读 2017-08-14 16:19:12
    给定两个矩阵$A$和$B$,你需要判断它们是否可以相乘,若可以请输出相乘后的矩阵。 Input 第一行输入一个整数$T$,代表有$T$组测试数据。 每组数据第一行输入两个整数$N,M$,代表矩阵$A$的行、列。 ...

    Description

    给定两个矩阵$A$和$B$,你需要判断它们是否可以相乘,若可以请输出相乘后的矩阵。

    Input

    第一行输入一个整数$T$,代表有$T$组测试数据。

    每组数据第一行输入两个整数$N,M$,代表矩阵$A$的行、列。

    接下来$N$行,每行输入$M$个整数$a[][]$。

    之后一行输入两个整数$n,m$,代表矩阵$B$的行、列。

    接下来$n$行,每行输入$m$个整数$b[][]$。

    注:$1 <= T <= 500,1 <= N,m <= 100,1 <= M,n <= 10,1 <= $矩阵元素$<= 20$。

    Output

    若矩阵$A、B$可以相乘,先输出$YES$,再输出相乘得到的矩阵。

    对每行的矩阵元素,每两个元素之间有一个空格,最后一个没有空格。

    反之输出$NO$。

    Sample Input

    2
    2 2
    1 1
    1 1
    2 3
    1 1 1
    1 1 1
    2 3
    1 1 1
    1 1 1
    2 2
    1 1
    1 1 

    Sample Output

    YES
    2 2 2
    2 2 2
    NO 

    要搞清楚整个矩阵相乘的过程才能写好循环

    #include<cstdio>  
    #include<cstring>  
    #define MAX 105   
    int a[MAX][11],b[11][MAX],c[MAX][MAX];  //定义三个数组 
    int m,N,M,n,T;  
    int main()  
    {  
        int i,j;  
        while(scanf("%d",&T)!=EOF)  
        {  
            while(T--)  
            {  
                scanf("%d%d",&N,&M);  // N行M列 
                for(i=0;i<N;i++)  
                    for(j=0;j<M;j++)  
                        scanf("%d",&a[i][j]);  //输入数组a
                scanf("%d%d",&n,&m);  //n行m列 
                for(i=0;i<n;i++)  
                    for(j=0;j<m;j++)  
                        scanf("%d",&b[i][j]);  //输入数组b               
                if(M!=n)    //判断两个矩阵是否可以相乘 
    			printf("NO\n");  
                else 
    			{  
    	            printf("YES\n");  
    	            memset(c,0,sizeof(c));  //清空数组c 
    	            int k;  
    	            for(k=0;k<N;k++)  
    	            {  
    	                for(j=0;j<m;j++)  
    	                {  
    	                    for(i=0;i<n;i++)  
    	                    {  
    	                        c[k][j]+=a[k][i]*b[i][j];     //根据循环求数组c                 
    	                    }  	                          
    	                }  
                }         
                for(i=0;i<N;i++)  
                    for(j=0;j<m;j++)  
                        printf("%d%c",c[i][j],j==m-1?'\n':' ');  //判断是否需要换行 
                }         
            }  
        }  
        return 0;  
    }  






    展开全文
  • 矩阵乘法 根据矩阵乘法规则,如a[4,3]×b[3,2]将会产生一个r[4,2]的新矩阵,r[i][j]=a[i][0]×b[0][j]+a[i][1]×b[1][j]+a[i][2]×b[2][j]。 下面为源代码: package 课本例题第三章数组; public class Example_3_4...
  • PyTorch 对应点相乘、矩阵相乘

    万次阅读 多人点赞 2018-09-07 21:14:27
    一,对应点相乘,x.mul(y) ,即点乘操作,点乘不求和操作,又可以叫作Hadamard product;点乘再求和,即为卷积 data = [[1,2], [3,4], [5, 6]] tensor = torch.FloatTensor(data) tensor Out[27]: tensor([[ 1.,...
  • 很惭愧地说,之前矩阵相乘一直在调函数,从来没有自己实现过,自己是非计算机科班出身,感觉基础确实一般。所以今天试着写了个多线程矩阵乘法作为练习,看看计算效率如何,如有问题欢迎交流指正。这里矩阵用的是 ...
  • 矩阵乘法(两个给定大小的矩阵相乘)题目要求代码实现 题目要求 实现函数 void Matrix_Mul(int a[3][2], int b[2][4]),计算两个矩阵的乘积(矩阵分别为32和 24)。 计算后输出结果矩阵,按行输出,行之间用回车隔开...
  • 简单介绍矩阵乘法

    千次阅读 2016-10-18 21:27:42
    矩阵乘法
  • 直接上代码吧 matlab clc close all clear all tic; c = rand(7500,7500)*rand(7500,1);toc; Elapsed time is 2.576807 seconds.   opencv code #include #include ...using na
  • @tf_export("matmul") def matmul(a, b, transpose_a=False, transpose_b=False, adjoint_a=False, adjoint_b=False, a_is_sparse=False, ...
  • CULA的矩阵相乘: culaDeviceDgemm('N','N',n,m,k,alpha, b_device,n, //b k x n a_device,k, //a m x k beta, c_device,n); 上式表示:C=A*B的矩阵相乘方法,而且数据类型为double,也可以使用float类型数据的函数...
  • 矩阵相乘入门,两个矩阵相乘

    千次阅读 2013-05-01 10:52:31
    矩阵乘法:定义矩阵A,B。A和B可以乘法操作当且仅当A的大小是a×b,B的大小是b×c,设矩阵C=AB,则C的大小是a×c,且有  最普通的矩阵乘法是直接三个for循环直接计算而已,所以复杂度是O(n3) #include using ...
  • 使用动态规划方法,n个矩阵相乘有以下递归性质: M[i][j]=min(i−1)(M[i][k]+M[k+1][j]+di−1dkdj) (if i)M[i][j]=min_{(i)}(M[i][k]+M[k+1][j]+d_{i-1}d_{k}d_{j})\ \ (if\ \ i) M[i][j]=0M[i][j]=0#include...
  • 设有NxN阶矩阵A,那么矩阵A的迹(用tr(A)表示)就等于A的特征值的总和,也即矩阵A的主对角线元素(左上到右下方向)的总和。 例如2阶矩阵A为 2 3 4 5 其迹为tr(A)=2+5=7 现在要求求取两个N阶矩阵A与B乘积的迹,也即...
  • 参考的是《游戏和图形学的3D数学入门教程》,非常...单位矩阵就是右斜角全是1,其他位置是0的矩阵。 一个3x3的单位矩阵: 3.Transposition(转换) 经常看到一个矩阵的右上角有个T的符号,原来是Tra
  • 矩阵相乘multiply 求矩阵的逆矩阵inverse 有了这三个方法,足以进行机器人正逆运动学分析了。 直接上代码: #include&amp;amp;amp;lt;iostream&amp;amp;amp;gt; #include&amp;amp;amp;lt;stdlib.h&...
  • 【T1 T2】1*2我想让帮做这么一个简单的矩阵,要求D1和D2随机的变动rm(list=ls()) gc()options(scipen = 2000) #################定义TT矩阵(1*2) TT (c(1,3),1,2)DD(c(1,2),2,1) result1 *% TT#############
  • Java-矩阵乘法

    2018-12-09 19:10:32
    矩阵乘法的前提是:前一矩阵的行数 == 后一矩阵的列数(rows == cols) 在满足前提的情况下:前一矩阵的第一行 与 第二个矩阵的第一列 逐个相乘。将乘积求和 作为 结果矩阵的第一个元素 类推刻...
  • 更新中 转载于:https://www.cnblogs.com/chamie/p/8619994.html
  • 算法提高 矩阵相乘

    千次阅读 2017-02-12 15:22:33
     小明最近在为线性代数而头疼,线性代数确实很抽象(也很无聊),可惜他的老师正在讲这矩阵乘法这一段内容。  当然,小明上课打瞌睡也没问题,但线性代数的习题可是很可怕的。  小明希望你来帮他完成这个任务。...
  • Strassen矩阵相乘算法

    千次阅读 2015-08-17 20:04:48
    引言Strassen的矩阵相乘方法是一种典型的分治算法。目前为止,我们已经见过一些分治策略的算法了,例如归并排序和Karatsuba大数快速乘法。现在,让我再来看看分治策略的背后是什么。同动态规划不同,在动态规划中,...
  • spark矩阵向量-矩阵矩阵相乘

    千次阅读 2014-07-17 08:57:30
    val paramatrix1 = sc.parallelize(List(Vector(2, 2, 4), Vector(3, 2, 1), Vector(1, 3, 2)))

空空如也

1 2 3 4 5 ... 20
收藏数 19,408
精华内容 7,763
关键字:

矩阵相乘