免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2480 | 回复: 1
打印 上一主题 下一主题

矩阵相乘 matrix multiply, please?? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-16 16:49 |只看该作者 |倒序浏览
  1. #!/usr/bin/perl

  2. use strict;

  3. my $matrix_name;
  4. my $str =<< 'EOF';
  5. matrixa
  6. 12 4
  7. 10 30

  8. matrixb
  9. 5 6
  10. 1 10
  11. EOF

  12. \matrix_read_file();
  13. my @array = \matrix_multiply(\@{$matrix_name->[0]}, \@{$matrix_name->[1]});
  14. print @array;

  15. sub matrix_read_file {
  16.         while($str) {
  17.                 chomp $str;
  18.                 next if $str =~ /^\s*$/;
  19.                 if ($str =~ /^([A-Za-z]\w*)/) {
  20.                         $matrix_name = $1;
  21.                 } else {
  22.                         my (@row) = split (/\s+/, $str);
  23.                         push (@{$matrix_name}, \@row);
  24.                 }
  25.         }
  26.         $matrix_name
  27. }

  28. sub matrix_multiply {
  29.         my ($r_mat1, $r_mat2) = @_;
  30.         my $r_product;
  31.         my ($r1, $c1) = matrix_count_rows_cols($r_mat1);
  32.         my ($r2, $c2) = matrix_count_rows_cols($r_mat2);
  33.         die "Matrixs cannot multiply\n" unless ($c1 == $c2);
  34.         for (my $I=0; $I<$r1; $I++) {
  35.                 for (my $J; $J<$c2; $J++) {
  36.                         my $sum = 0;
  37.                         for (my $k=0; $k<$c1; $k++) {
  38.                                 $sum += $r_mat1->[$I][$k] * $r_mat2->[$k][$J];
  39.                         }
  40.                         $r_product->[$I][$J] = $sum;
  41.                 }
  42.         }
  43.         $r_product;
  44. }

  45. sub matrix_count_rows_cols {
  46.         my $r_mat = @_;
  47.         my $num_rows = @$r_mat;
  48.         my $num_cols = @{$r_mat->[0]};
  49.         ($num_rows, $num_cols);
  50. }
复制代码

帮我改改,学的不好.

论坛徽章:
0
2 [报告]
发表于 2007-06-16 17:14 |只看该作者

  1. use warnings;
  2. use strict;

  3. use PDL;

  4. my $a = pdl[[12,4], [10,30]];
  5. my $b = pdl[[5,6], [1,10]];

  6. my $c = $a x $b;

  7. print $c;
复制代码

output

  1. [
  2. [ 64 112]
  3. [ 80 360]
  4. ]
复制代码

[ 本帖最后由 alexru 于 2007-6-16 17:16 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP