DL4J实战之五:矩阵操作基本功 (3)

加减乘除,入参是一个标量,会与矩阵中的所有元素做计算

// 准备好原始数据,2行3列矩阵 indArray6 = Nd4j.create(new float[] {1, 2, 3, 4, 5, 6}, new int[] {2,3}); // 加法 disp("加法", indArray6.add(1)); // 减法 disp("减法", indArray6.sub(1)); // 乘法 disp("乘法", indArray6.mul(2)); // 除法 disp("除法", indArray6.div(2));

执行结果

加法 维度 : 2 形状 : [2, 3] 完整矩阵 : [[ 2.0000, 3.0000, 4.0000], [ 5.0000, 6.0000, 7.0000]] ***************************************************** 减法 维度 : 2 形状 : [2, 3] 完整矩阵 : [[ 0, 1.0000, 2.0000], [ 3.0000, 4.0000, 5.0000]] ***************************************************** 乘法 维度 : 2 形状 : [2, 3] 完整矩阵 : [[ 2.0000, 4.0000, 6.0000], [ 8.0000, 10.0000, 12.0000]] ***************************************************** 除法 维度 : 2 形状 : [2, 3] 完整矩阵 : [[ 0.5000, 1.0000, 1.5000], [ 2.0000, 2.5000, 3.0000]]

前面的add方法,执行完毕后会生成一个新的NDArray实例,不影响原对象,但如果调用的是addi,就会修改原对象的内容:

INDArray indArray8 = Nd4j.create(new float[] {1, 2, 3, 4, 5, 6}, new int[] {2,3}); disp("替换前", indArray8); indArray8.addi(1); disp("替换后", indArray8);

执行结果

替换前 维度 : 2 形状 : [2, 3] 完整矩阵 : [[ 1.0000, 2.0000, 3.0000], [ 4.0000, 5.0000, 6.0000]] ***************************************************** 替换后 维度 : 2 形状 : [2, 3] 完整矩阵 : [[ 2.0000, 3.0000, 4.0000], [ 5.0000, 6.0000, 7.0000]]

展开:Nd4j.toFlattened,2行3列的二维矩阵展开后成了一维的

disp("展开", Nd4j.toFlattened(indArray6));

执行结果

展开 维度 : 1 形状 : [6] 完整矩阵 : [ 1.0000, 2.0000, 3.0000, 4.0000, 5.0000, 6.0000]

转换:reshape,相当于使用原有数据,但是换一个shape入参

disp("转换", indArray6.reshape(3,2));

执行结果

转换 维度 : 2 形状 : [3, 2] 完整矩阵 : [[ 1.0000, 2.0000], [ 3.0000, 4.0000], [ 5.0000, 6.0000]]

提取正方形矩阵的对角线:diag,得到的结果是一维的

// 创建一个人3行3列的正方形矩阵 INDArray indArray9 = Nd4j.create(new float[] {1, 2, 3, 4, 5, 6, 7, 8, 9}, new int[] {3,3}); disp("3*3矩阵", indArray9); // 提取正方形矩阵的对角线 disp("3*3矩阵的对角线", Nd4j.diag(indArray9));

执行结果如下图,diag方法得到了源对象的对角线

在这里插入图片描述

基于源矩阵形状创建新矩阵,且值都相通(入参值),然后用此新矩阵减去源矩阵:rsub

// 初始化一个2行3列的矩阵 INDArray indArray11 = Nd4j.create(new float[] {1, 2, 3, 4, 5, 6}, new int[] {2,3}); // 参考indArray12的结构创建一个2行3列的矩阵,该矩阵的所有元素的值都等于10(入参), // 然后,用该矩阵减去indArray11,结果作为rsub方法的返回值返回 INDArray indArray12 = indArray11.rsub(10); disp("rsub方法", indArray12);

执行结果如下,可见所有值都是10减去源矩阵对应位置的值:

rsub方法 维度 : 2 形状 : [2, 3] 完整矩阵 : [[ 9.0000, 8.0000, 7.0000], [ 6.0000, 5.0000, 4.0000]]

两个矩阵相加:add,两个形状相通的矩阵,同样位置的值相加:

INDArray indArray13 = Nd4j.create(new float[] {1, 2, 3, 4, 5, 6}, new int[] {2,3}); INDArray indArray14 = Nd4j.create(new float[] {1, 1, 1, 1, 1, 1}, new int[] {2,3}); disp("矩阵相加", indArray13.add(indArray14));

执行结果

矩阵相加 维度 : 2 形状 : [2, 3] 完整矩阵 : [[ 2.0000, 3.0000, 4.0000], [ 5.0000, 6.0000, 7.0000]]

叉乘:mmul,2行3列乘以3行2列,

INDArray indArray13 = Nd4j.create(new float[] {1, 2, 3, 4, 5, 6}, new int[] {2,3}); INDArray indArray15 = Nd4j.create(new float[] {1, 2, 3, 4, 5, 6}, new int[] {3,2}); disp("2行3列", indArray13); disp("3行2列", indArray15); disp("2行3列矩阵与3行2列矩阵的叉乘", indArray13.mmul(indArray15));

执行结果,可见,2行3列矩阵的每一行的元素,都和3行2列矩阵每一列的元素做两两相乘再相加,一共四个值,所以结果就是2行2列的矩阵:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzwzdj.html