各种乘法的区别 “点积、外积、数乘...等

本文探讨了多种矩阵运算符号的使用,如⊙、∘、∗、⊗等,并推荐⊙作为最佳选择,因其视觉上类似乘法且无重载含义。同时,详细解析了numpy中的矩阵乘法、星乘与点乘的区别,包括element-wise product和matrix product的实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

I've seen several conventions, including ⋅⋅, ∘∘, ∗∗, ⊗⊗, and ⊙⊙. However, most of these have overloaded meanings (see http://en.wikipedia.org/wiki/List_of_mathematical_symbols).

Thus, in my personal experience, the best choice I've found is:

⊙(\odot) -- to me the dot makes it look naturally like a multiply operation (unlike other suggestions I've seen like ⋄⋄) so is relatively easy to visually parse, but does not have an overloaded meaning as far as I know.
Also:

This question comes up often in multi-dimensional signal processing, so I don't think just trying to avoid vector multiplies is an appropriate notation solution. One important example is when you map from discrete coordinates to continuous coordinates by x=i⊙Δ+bx=i⊙Δ+b where ii is an index vector, ΔΔ is sample spacing (say in mm), bb is an offset vector, and xx is spatial coordinates (in mm). If sampling is not isotropic, then ΔΔ is a vector and element-wise multiplication is a natural thing to want to do. While in the above example I could avoid the problem by writing xk=ikΔk+bkxk=ikΔk+bk, having a symbol for element-wise multiplication lets us mix and match matrix multiplies and elementwise multiplies, for example y=A(i⊙Δ)+by=A(i⊙Δ)+b.
Another alternative notation I've seen for z=x⊙yz=x⊙y for vectors is z=z= diag(x)y(x)y. While this technically works for vectors, I find the ⊙⊙ notation to be far more intuitive. Furthermore, the "diag" approach only works for vectors -- it doesn't work for the Hadamard product of two matrices.
Often I have to play nicely with documents that other people have written, so changing the overloaded operator (like changing dot products to 〈⋅,⋅〉〈⋅,⋅〉 notation) often isn't an option, unfortunately.
Thus I recommend ⊙, as it is the only option I have yet to come across that has seems to have no immediate drawbacks.

numpy中矩阵乘法,星乘(*)和点乘(.dot)的区别(对应元素相乘 element-wise product: np.multiply(), 或 *)

import numpy
a = numpy.array([[1,2],
                 [3,4]])
b = numpy.array([[5,6],
                 [7,8]])


a*b
>>>array([[ 5, 12],
          [21, 32]])

a.dot(b)
>>>array([[19, 22],
          [43, 50]])

numpy.dot(a,b)
>>>array([[19, 22],
          [43, 50]])

numpy.dot(b,a)
>>>array([[23, 34],
          [31, 46]])

总结:

星乘表示矩阵内各对应位置相乘,矩阵a*b下标(0,0)=矩阵a下标(0,0) x 矩阵b下标(0,0);

点乘表示求矩阵内积,二维数组称为矩阵积(mastrix product)。

用文字表述:

所得到的数组中的每个元素为,第一个矩阵中与该元素行号相同的元素与第二个矩阵与该元素列号相同的元素,两两相乘后再求和。

文字难以理解,直接上图:

综上所述,二维矩阵a*b下标(0,1)=矩阵a下标(0,) x 矩阵b下标(,1)

补充:

一维矩阵下标

[(0),(1),(2),(3)]

二维矩阵下标

[[(0,0),(0,1),(0,2),(0,3)],
 [(1,0),(1,1),(1,2),(1,3)],
 [(2,0),(2,1),(2,2),(2,3)],
 [(3,0),(3,1),(3,2),(3,3)]]

 

<think>嗯,用户问向量矩阵乘法区别,这需要先回顾他们的定义。向量是两个向量对应元素相后求,结果是个标量。而矩阵乘法是行列,得到新矩阵。用户之前可能对矩阵乘法已经有了解,现在需要更深入的区别。 用户可能是在学习线性代或NumPy库时遇到这个问题,需要明确两者的不同应用场景。之前的对话中,我用炒菜的例子解释了不同乘法操作的区别,现在需要更直接的回答。 需要确认矩阵乘法学定义,以及在实际应用中的不同。比如,向量用于计算投影、夹角,而矩阵乘法用于线性变换、神经网络层之间的转换。 还要注意,在NumPy中,np.dot对于两个一维组是,对于二维及以上可能是矩阵乘法,但行为可能不同,这可能让用户混淆。需要指出使用场景维度的不同导致的结果差异。 可能用户之前对@符号np.dot的区别有疑问,现在进一步明确向量矩阵的情况。需要举例说明,比如两个向量的结果是标量,而矩阵乘法的结果是矩阵,或者当向量被视为行/列矩阵时的不同。 还要考虑用户可能的误区,比如认为向量是矩阵乘法的特例,但实际上在矩阵乘法中,如果向量作为行向量列向量相,结果等同于,但结构上是1x1矩阵,而直接是标量。 总结时,要分列出区别,包括输入、输出、学意义应用场景,帮助用户清晰理解。</think>### **向量 vs 矩阵乘法——一句话概括** **向量是“压缩成标量”,矩阵乘法是“扩展成矩阵”**。 它们的核心区别在于输入、输出运算规则的不同,具体如下: --- ### **1. 输入不同** | **操作** | **输入要求** | |----------------|-----------------------------------------------------------------------------| | **向量** | 两个 **一维向量**(长度相同),例如:`[1,2,3]` `[4,5,6]`。 | | **矩阵乘法** | 两个 **二维矩阵**(第一个矩阵的列 = 第二个矩阵的行),例如:`(2×3)` `(3×4)`。 | --- ### **2. 运算规则不同** #### **向量(Dot Product)** - **操作**:对应位置元素相后 **相加求**。 - **学公式**: \[ \text{结果} = \sum_{i=1}^n a_i \cdot b_i \] - **例子**: ```python a = [1, 2, 3] b = [4, 5, 6] 结果 = (1×4) + (2×5) + (3×6) = 4 + 10 + 18 = 32 ``` #### **矩阵乘法(Matrix Multiplication)** - **操作**:第一个矩阵的 **行** × 第二个矩阵的 **列**,生成新矩阵的每个元素。 - **学公式**: \[ C_{ij} = \sum_{k=1}^n A_{ik} \cdot B_{kj} \] - **例子**: ```python A = [[1, 2], # 形状 (2×2) [3, 4]] B = [[5, 6], # 形状 (2×2) [7, 8]] 结果矩阵 = [[ (1×5 + 2×7), (1×6 + 2×8) ], [ (3×5 + 4×7), (3×6 + 4×8) ]] = [[19, 22], [43, 50]] ``` --- ### **3. 输出结果不同** | **操作** | **输出结果** | **形状** | |---------------|-----------------------------|-------------------------| | **向量** | 一个 **标量**(单个字) | 无维度(例如 `32`)。 | | **矩阵乘法** | 一个 **新矩阵** | 行 = 第一个矩阵的行,列 = 第二个矩阵的列(例如 `2×2`)。 | --- ### **4. 物理意义不同** - **向量**: - 衡量两个向量的 **相似性**(夹角越小,越大)。 - 计算投影长度:向量A在向量B方向上的投影长度 × 向量B的模长。 - **应用场景**:计算夹角、物理中的功(力与位移的)。 - **矩阵乘法**: - 表示 **线性变换的组合**(例如旋转、缩放等变换的叠加)。 - **应用场景**:神经网络中的全连接层、图形变换(如3D旋转)。 --- ### **5. 特殊情况:当向量被视为矩阵时** - **向量**可以看作矩阵乘法的特例,但需注意维度匹配: - 若将向量视为 **行向量(1×n)** **列向量(n×1)**,它们的矩阵乘法结果是一个 **1×1矩阵**(等同于的标量)。 ```python # 学中的写法 a = [1, 2, 3](行向量) b = [4, 5, 6]^T(列向量) a @ b = [[32]](1×1矩阵) → 等价于结果 32 ``` --- ### **通俗总结** - **向量**:两个向量“配对相再相加”,结果是字,用来衡量它们的“匹配程度”。 - **矩阵乘法**:两个矩阵“行列交错相再相加”,结果是新矩阵,用来组合复杂的变换。 --- ### **代码验证(Python)** ```python import numpy as np # 向量 a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) dot_result = np.dot(a, b) # 输出 32 # 矩阵乘法(向量视为行列矩阵) A = a.reshape(1, -1) # 行向量 (1×3) B = b.reshape(-1, 1) # 列向量 (3×1) matmul_result = A @ B # 输出 [[32]](1×1矩阵) # 二维矩阵乘法 C = np.array([[1, 2], [3, 4]]) D = np.array([[5, 6], [7, 8]]) matmul_result_2D = C @ D # 输出 [[19, 22], [43, 50]] ``` --- ### **选择何时用哪个?** - 想算两个向量的相似性 → ****。 - 想组合两个线性变换(如旋转后缩放) → **矩阵乘法**。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值