矩阵和向量的Fortran元素明智乘法

时间:2019-12-10 14:17:13

标签: fortran

是否有一种简单快捷的方法将矩阵的一列与向量的元素相乘。我们可以明确地做到这一点,

    DropdownButton(
        underline: SizedBox(),
        icon: Icon(
                    Icons.language,
                    color: Colors.white,
                    ),
        items: Language.getLanguages().map((Language lang) {
        return new DropdownMenuItem<String>(
                        value: lang.languageCode,
                        child: new Text(lang.name),
                      );
                    }).toList(),

        onChanged: (val) {
                      print(val);
                   },
      )

有没有一种方法可以在一行中执行do循环。例如,在Numpy python中,我们可以一次完成这项工作

program test
   integer :: x(3,3), y(3), z(3,3)
   x = reshape([(i,i=1,9)],[3,3])
   y = [1,2,3]
   do i=1,3
      z(:,i) = x(:,i) * y(i)
      print *, z(:,i)
   enddo
end program test

2 个答案:

答案 0 :(得分:2)

尝试

z = x * spread(y,1,3)

,如果这不起作用(此计算机上没有Fortran,因此我没有检查过),则摆弄spread直到它起作用为止。实际上,您可能希望将3替换为size(x,1)之类。

我希望这会导致编译器创建临时数组。而且,我希望能够轻松找到问题表现不及显式循环方案的情况。 “纯净的”单线通常在时间和空间上都有成本。经常使用的经过验证的Fortran显式循环方法是一种。

答案 1 :(得分:2)

为什么用垃圾替换清晰易读的代码?

program test
  implicit none
  integer i,j
  integer :: x(3,3), y(3), z(3,3)
  x = reshape([(i,i=1,9)],[3,3])
  y = [1,2,3]
  z = reshape ([((x(j,i)*y(i) ,j=1,3),i=1,3)], [3,3])
  print *, z(1,:)
  print *, z(2,:)
  print *, z(3,:)
end program test