Java矩阵算法初识 用矩阵模拟计算购物车总价

传统计算购物车总价都是for循环中单价*数量相加,还有什么办法?抛砖引玉的开始接触矩阵算法。

在此之前需要了解矩阵的基本知识 - 矩阵的运算及其运算规则

运算规则总结:

  1. 矩阵加减法:只有两个同型矩阵(行数 & 列数相同)才能进行相加减,满足交换律和结合律。
  2. 矩阵&数相乘: 数 * 矩阵中的每个数,满足分配律和交换律
  3. 矩阵&矩阵相乘: 只有当左边矩阵的列数等于右边矩阵的行数时,才可以相乘,乘积矩阵的行数等于左边矩阵的行数,乘积矩阵的列数等于右边矩阵的列数,矩阵的乘法是左行乘右列。

尝试使用java用矩阵来计算购物车总价

首先引入java矩阵包ujmp-core

<!-- 矩阵类和线性代数函数 -->
<dependency>
    <groupId>org.ujmp</groupId>
    <artifactId>ujmp-core</artifactId>
    <version>0.3.0</version>
</dependency>

因为只有单价和数量,我们创建一个1xn 和 nx1的矩阵
在这里插入图片描述


在代码中,我们先定义一个List集合模拟上图矩阵中的1,2,3

@Data
class Number {
    // 单价
    private BigDecimal price;
    // 数量
    private Integer quantity;
}
/**
 * @Author: zengwei
 * @Email: 1014483974@qq.com
 */
public static List<Number> getList() {
    List<Number> list = new ArrayList<>();
    for (int i = 1; i <= 3; i++) {
        Number number = new Number();
        number.setPrice(new BigDecimal(i));
        number.setQuantity(i);
        list.add(number);
    }
    return list;
}

创建一个 1xn的矩阵,即1行n列,并进行赋值

/**
 * @Author: zengwei
 * @Email: 1014483974@qq.com
 * 能日赚30手赚试玩平台,推荐使用iphone操作 
 * https://mp.weixin.qq.com/s?__biz=MzIyODgxNjkyOQ==&mid=100000040&idx=1&sn=47c0245f9dbe70f3ad6b2540209af2c2&chksm=684d60665f3ae97095ba07d8c6804bac4f55dbc6e7100fbb233945f65364df88682d41332eb7&xtrack=1&scene=0&subscene=10000&clicktime=1616647421&enterid=1616647421&ascene=7&devicetype=android-29&version=28000165&nettype=WIFI&abtest_cookie=AAACAA%3D%3D&lang=zh_CN&exportkey=AdxLWFyJlgtM6uFZCpgWtBk%3D&pass_ticket=G8rEeGdox4FPpICRkrKy6ho2QZozCzXi%2Be7gV5bXnQaXoZK2pw4S8Wf2j%2Bt3D8mi&wx_header=1
 */
List<Number> list = getList();
Matrix matrix1 = DenseMatrix.Factory.zeros(1, list.size());
for (int i = 0; i < list.size(); i++) {
    Number number = list.get(i);
    matrix1.setAsBigDecimal(number.getPrice(), i, 0);
    matrix1.setAsInt(number.getQuantity(), 0, i);
}
System.out.println(matrix1);

输入如下
在这里插入图片描述


第二个矩阵,直接使用第一个矩阵的话,我们需要用到转置,做乘法矩阵1的行数必须等于矩阵2的列数,且为行的矩阵在前。

/**
 * @Author: zengwei
 * @Email: 1014483974@qq.com
 */
Matrix matrix2 = matrix1.transpose();
System.out.println(matrix2);

输出如下
在这里插入图片描述

手赚试玩平台,能日赚30,已亲测有效


将矩阵1 * 矩阵2,实现计算

/**
 * @Author: zengwei
 * @Email: 1014483974@qq.com
 */
Matrix matrix = matrix1.mtimes(matrix2);
System.out.println(matrix);

输出如下
在这里插入图片描述


计算过程为 (1 * 1) + (2 * 2) + (3 * 3) = 14
在这里插入图片描述


和for循环比较一下运行时间谁更快,定义一个for循环

/**
 * @Author: zengwei
 * @Email: 1014483974@qq.com
 */
BigDecimal totalFee = BigDecimal.ZERO;
for (Number number : list) {
    BigDecimal big = number.getPrice().multiply(new BigDecimal(number.getQuantity()));
    totalFee = totalFee.add(big);
}
System.out.println("for 循环 = " + totalFee);

当数据少时,for循环的运行速度比矩阵快
在这里插入图片描述
当我把模拟数据加大,再次运行

/**
 * @Author: zengwei
 * @Email: 1014483974@qq.com
 * 能日赚30手赚试玩平台,推荐使用iphone操作 
 * https://mp.weixin.qq.com/s?__biz=MzIyODgxNjkyOQ==&mid=100000040&idx=1&sn=47c0245f9dbe70f3ad6b2540209af2c2&chksm=684d60665f3ae97095ba07d8c6804bac4f55dbc6e7100fbb233945f65364df88682d41332eb7&xtrack=1&scene=0&subscene=10000&clicktime=1616647421&enterid=1616647421&ascene=7&devicetype=android-29&version=28000165&nettype=WIFI&abtest_cookie=AAACAA%3D%3D&lang=zh_CN&exportkey=AdxLWFyJlgtM6uFZCpgWtBk%3D&pass_ticket=G8rEeGdox4FPpICRkrKy6ho2QZozCzXi%2Be7gV5bXnQaXoZK2pw4S8Wf2j%2Bt3D8mi&wx_header=1
 */
public static List<Number> getList() {
    List<Number> list = new ArrayList<>();
    for (int i = 1; i <= 1000000; i++) {
        Number number = new Number();
        number.setPrice(new BigDecimal(1));
        number.setQuantity(1);
        list.add(number);
    }
    return list;
}

输出结果,当数据量大的时候,矩阵和for循环的区别就出来了
在这里插入图片描述


目前也正在学习中,有不妥的地方可以指出,互相学习,互相进步

在这里插入图片描述
未经允许,禁止转载

知识共享许可协议
本作品采用知识共享署名 4.0 国际许可协议进行许可。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值