Board logo

标题: [数值计算] 【已解决】求助批处理矩阵乘法 [打印本页]

作者: xeqxerxes    时间: 2009-4-1 12:57     标题: 【已解决】求助批处理矩阵乘法

假设A.TXT中有个矩阵,括号可以省略
A11 A12 A13
A21 A22 A23
A31 A32 A33
批处理可以算出乘法,那如何求出改矩阵与矩阵
B11
B21
B31
的乘法呢?
要求将结果写如R.TXT
格式象A中一样
举个例子,比如这两个矩阵相乘得
A11*B11+A12*B21+A13*B31
A21*B11+A22*B21+A23*B31
A31*B11+A32*B21+A33*B31
如果为2*2得 就是两行两列,括号我不打了
第一行乘第一列相加 第一行乘第二列相加
第二行乘第一列相加 第二行乘第二列相加

[ 本帖最后由 xeqxerxes 于 2009-4-2 17:09 编辑 ]
作者: Batcher    时间: 2009-4-1 14:21

把矩阵乘法的算术表达式更新到顶楼吧
不是每个人都知道矩阵乘法是咋回事
作者: Lumiere    时间: 2009-4-1 14:22

学过,可是忘记乘法的规则了,呵呵,太长时间了
作者: lhjoanna    时间: 2009-4-1 19:54

加了简单的注释,无误后改输出为R.txt。
  1. @echo off&setlocal enabledelayedexpansion
  2. rem ------------------------------
  3. rem 创建两个矩阵
  4. rem ------------------------------
  5. call :create a.txt A
  6. call :create b.txt B
  7. rem -----------------------------
  8. rem  验证是否可以进行矩阵乘法
  9. rem -----------------------------
  10. if not !lie_A! equ !hang_B! (
  11.    echo 两矩阵无法相乘
  12.    pause>nul
  13.    goto :eof
  14. )
  15. rem ------------------------------
  16. rem   矩阵相乘
  17. rem ------------------------------
  18. echo.&echo  The result is:&echo.
  19. set /a hang_A-=1,lie_B-=1,lie_A-=1
  20. for /l %%i in (0 1 !hang_A!) do (
  21.     for /l %%j in (0 1 !lie_B!) do (
  22.         for /l %%k in (0 1 !lie_A!) do (
  23.             set /a tmp=.A%%i%%k*.B%%k%%j
  24.             set /a result+=tmp
  25.         )
  26.         call :unify
  27.         set /p= !result!<nul
  28.         set /a result=0
  29.     )
  30.     echo.
  31. )
  32. pause>nul
  33. goto :eof
  34. rem ----------------------------
  35. rem 子程序:创建矩阵
  36. rem ----------------------------
  37. :create
  38. set /a i=0
  39. for /f "delims=" %%a in (%~1) do (
  40.      set /a j=0
  41.      set "str=%%a"
  42.      for %%b in (!str!) do (
  43.         set .%~2!i!!j!=%%b
  44.         set /a j+=1
  45.      )
  46.      set /a i+=1
  47. )
  48. set /a hang_%~2=i,lie_%~2=j
  49. goto :eof
  50. rem -----------------------------
  51. rem 子程序:统一输出格式
  52. rem -----------------------------
  53. :unify
  54. if !result! lss 100 set "result= !result!"
  55. if !result! lss 10  set "result= !result!"
  56. goto :eof
复制代码

作者: xeqxerxes    时间: 2009-4-2 17:09     标题: 回复 4楼 的帖子

佩服!
这样都行!
作者: lhjoanna    时间: 2009-4-2 18:53

虽然已经结贴,但补充两点:
  1、对于验证矩阵是否可以相乘的部分,我只是简单的检查了A矩阵最后一行的元素个数和B矩阵最后一列的元素个数是否相等。并没有判断a.txt和b.txt中的数据是否能构成矩阵。
  2、对于矩阵相乘的算法,我列出的这种是最笨的算法,也是效率很低的算法。在行数和列数相当的情况下,时间复杂度会达到3次方。如果矩阵行、列数很大,就需要借用高级语言来实现一些优化的算法了。

[ 本帖最后由 lhjoanna 于 2009-4-2 19:40 编辑 ]




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2