windlx实验-矩阵相乘

 ;********multiply an array to an array*****
;*******    Written by heiden     *********
;三个矩阵按行存储
;第一个矩阵的大小为:5*4

;第二个矩阵的大小为:4*3

;存放结果的矩阵大小为:5*3
;l 代表了第一个矩阵的当前被扫描的那行
;r4<=r  相对于result的偏移量
;r5<-l 
;r10<-i  第一个矩阵某一行的某个元素的索引
;r7<-j  第二个矩阵某一列的某个元素的索引

  .data
 

;**buffer of first array
  .global dat1
dat1: .space 20
;**buffer of second array
  .global dat2
dat2: .space 12
;**buffer of result
  .global result
result: .space 15


  .text
  .global main
main:
  addi r11,r0,0 ;temp
  addi r4,r0,0   ;r
  addi r5,r0,0   ;l
  addi r1,r0,5   ;

  movi2fp f1,r1
  addi r1,r0,4
  movi2fp f2,r1   ;n
  addi r1,r0,3
  movi2fp f3,r1   ;k
 
 
line: movi2fp f4,r5  ;判断是否扫描完
  ltf f4,f1  ;l<m?
  bfpf finish
  addi r6,r0,0  ;col
column: movi2fp f4,r6
  ltf f4,f3  ;col<k
  bfpf leveladd
 
  movfp2i r1,f2 
  multu r10,r5,r1   ;i<-l*n
  addi r7,r6,0  ;mov col to j
  addi r11,r0,0    ;temp=0
  addi r9,r5,1  ;r9<-l+1
  movfp2i r1,f2
  multu r9,r1,r9 ;p<-n*(l+1)
calculate: movi2fp f4,r10
  movi2fp f9,r9
  ltf f4,f9  ;compare i to p
  bfpf asign
  addi r1,r10,dat1
  lbu r2,0(r1)  ;??
  addi r1,r7,dat2
  lbu r3,0(r1)   ;??
  multu r1,r2,r3 ;temp1<-dat1[i]+dat2[j]
  add r11,r11,r1 ;temp<-temp+temp1
  addi r10,r10,1  ;i++
  movfp2i r1,f3  
  add r7,r7,r1   ;j<-j+k
  j calculate
asign:addi r1,r4,result
  sb 0(r1),r11  ;store result ??
  addi r4,r4,1
  addi r6,r6,1
  j column
leveladd:addi r5,r5,1
  j line
finish: trap 0  ;**end
 
 

此程序为实现5*4的矩阵与4*3的矩阵相乘.尚未使用循环展开技术

Windlx模拟器中,您可以使用以下步骤实现矩阵相乘: 1. 打开终端并进入要保存代码的目录。 2. 创建名为“matrix_multiplication.c”的新文件。 3. 使用任何文本编辑器打开该文件,并将以下代码复制并粘贴到该文件中: ```c #include <stdio.h> int main() { int m, n, p, q, c, d, k, sum = 0; int first[10][10], second[10][10], multiply[10][10]; printf("Enter the number of rows and columns of first matrix\n"); scanf("%d%d", &m, &n); printf("Enter the elements of first matrix\n"); for (c = 0; c < m; c++) for (d = 0; d < n; d++) scanf("%d", &first[c][d]); printf("Enter the number of rows and columns of second matrix\n"); scanf("%d%d", &p, &q); if (n != p) printf("The matrices can't be multiplied with each other.\n"); else { printf("Enter the elements of second matrix\n"); for (c = 0; c < p; c++) for (d = 0; d < q; d++) scanf("%d", &second[c][d]); for (c = 0; c < m; c++) { for (d = 0; d < q; d++) { for (k = 0; k < p; k++) { sum = sum + first[c][k]*second[k][d]; } multiply[c][d] = sum; sum = 0; } } printf("Product of the matrices:\n"); for (c = 0; c < m; c++) { for (d = 0; d < q; d++) printf("%d\t", multiply[c][d]); printf("\n"); } } return 0; } ``` 4. 保存并关闭该文件。 5. 在终端中,使用以下命令编译该代码: ```bash gcc matrix_multiplication.c -o matrix_multiplication ``` 6. 运行该程序: ```bash ./matrix_multiplication ``` 7. 按照提示输入两个矩阵的维数和元素。程序将输出这两个矩阵的乘积。 请注意,此代码仅限于处理最多10x10大小的矩阵。如果您需要处理更大的矩阵,请相应地修改代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值