二维矩阵乘法、矩阵转置、 矩阵与向量乘法(java实现)

二维矩阵乘法、矩阵转置、 矩阵与向量乘法(java实现)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
相关代码如下:
package algorithms;
//矩阵库

public class Matrisx {

/**
 *向量点相乘 double dot(double[] x, double[] y)
 *矩阵与矩阵之积 double[][] mult(double[][] a,double[][]b)
 *矩阵转置 double[][] transpose(double[][] a)
 * 向量和矩阵之积 double[] mult(double[] y,double[][] a)
 */
//向量点乘:对应元素乘积和
public static double dot(double[] x, double[] y)
{
    double a = 0;
    //相乘条件:必须长度相等
    if( x.length != y.length)
    {
        //抛出异常
        return a;
    }
    //dot 是相应元素乘积和
    for(int i = 0; i < x.length; i++)
    {
        a += x[i] * y[i];
    }
    return a;

}
//矩阵与矩阵相乘
/**
 * 条件:它只有在第一个矩阵的列数(column)和第二个矩阵的行数(row)相同
 * A*B=C 其中C的行数等于A的行数,C的列数等于B的列数
 *
 * 定义:一个n行m列的矩阵乘以一个m行p列的矩阵,得到的结果是一个n行p列的矩阵
 * 其中的第i行第j列位置上的数等于它前一个矩阵第i行上的m个数与后一个矩阵第j列上的m个数对应
 * 相乘后所有m个乘积的和
 */
public static double[][] mult(double[][] a,double[][]b)
{
    int M = a[0].length;//M为a的列数
    int N = a.length;//N为a的行数
    int P = b[0].length;//P为b的列数
    // Q==M 可不写
    int Q = b.length;//Q为b的行数
    double[][] c = new double[N][P];//矩阵c取a的行数,b的列数
    //条件是 :a矩阵的列数等于b矩阵的行数
    if( M != P )
    {
        //此处抛出异常
    }
    //矩阵c应该是N行P列的
    for(int i = 0; i < N; i++)
    {
        for(int j = 0; j < P; j++)
        {
            //关键:这里的终止条件是M,也就是a的列数(其实也可以是b的行数Q 因为 Q == M)
            for(int k = 0; k < M; k++)
            {
                c[i][j] += a[i][k] * b[k][j];
            }
        }
    }
    return c;
}


/**
 * Matrix transposition
 *矩阵转置
 */
public static double[][] transpose(double[][] a)
{
    double[][] b = new double[a[0].length][a.length];
    for(int i = 0; i < a[0].length; i++)
    {
        for(int j = 0; j < a.length; j++)
        {
            /**
             * 这种方法只适用于方阵,即a[N][N],如果用于a[M][N]( M!=N ),会出现越界现象
             * double temp = a[i][j];
             * a[i][j] = a[j][i];
             * a[j][i] = temp;
             */
            //采用新建一个数组的方式来赋值内外循环条件会变成相反
            b[i][j] = a[j][i];
        }
    }
    return b;
}



/**
 *向量乘以矩阵
 * 就是相当于只有一行n列的矩阵与矩阵相乘,比二维矩阵相乘少一层循环。
 */
public static double[] mult(double[] y,double[][] a)
{
    int N = y.length;
    double[] c = new double[N];
    int M = y.length;
    if( M != a[0].length)
    {
        //抛出异常
    }
    for(int i = 0; i < N; i++)
    {
        for(int j = 0; j < M; j++)
        {
            c[i] += a[i][j] * y[i];
        }
    }
    return c;
}

}

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值