Project

General

Profile

Feature #10059 » using_define_method_for_Matrix__arithmetic.patch

gogotanaka (Kazuki Tanaka), 07/18/2014 08:29 AM

View differences:

lib/matrix.rb
878 878
  end
879 879

  
880 880
  #
881
  # Matrix addition.
881
  # Matrix addition and subtraction.
882 882
  #   Matrix.scalar(2,5) + Matrix[[1,0], [-4,7]]
883 883
  #     =>  6  0
884 884
  #        -4 12
885 885
  #
886
  def +(m)
887
    case m
888
    when Numeric
889
      Matrix.Raise ErrOperationNotDefined, "+", self.class, m.class
890
    when Vector
891
      m = self.class.column_vector(m)
892
    when Matrix
893
    else
894
      return apply_through_coercion(m, __method__)
895
    end
896

  
897
    Matrix.Raise ErrDimensionMismatch unless row_count == m.row_count and column_count == m.column_count
898

  
899
    rows = Array.new(row_count) {|i|
900
      Array.new(column_count) {|j|
901
        self[i, j] + m[i, j]
902
      }
903
    }
904
    new_matrix rows, column_count
905
  end
906

  
907
  #
908
  # Matrix subtraction.
909 886
  #   Matrix[[1,5], [4,2]] - Matrix[[9,3], [-4,1]]
910 887
  #     => -8  2
911 888
  #         8  1
912 889
  #
913
  def -(m)
914
    case m
915
    when Numeric
916
      Matrix.Raise ErrOperationNotDefined, "-", self.class, m.class
917
    when Vector
918
      m = self.class.column_vector(m)
919
    when Matrix
920
    else
921
      return apply_through_coercion(m, __method__)
922
    end
890
  %i(+ -).each do |op|
891
    define_method(op) do |m|
892
      case m
893
      when Numeric
894
        Matrix.Raise ErrOperationNotDefined, op, self.class, m.class
895
      when Vector
896
        m = self.class.column_vector(m)
897
      when Matrix
898
      else
899
        return apply_through_coercion(m, op)
900
      end
923 901

  
924
    Matrix.Raise ErrDimensionMismatch unless row_count == m.row_count and column_count == m.column_count
902
      Matrix.Raise ErrDimensionMismatch unless row_count == m.row_count && column_count == m.column_count
925 903

  
926
    rows = Array.new(row_count) {|i|
927
      Array.new(column_count) {|j|
928
        self[i, j] - m[i, j]
904
      rows = Array.new(row_count) {|i|
905
        Array.new(column_count) {|j|
906
          self[i, j].send(op, m[i, j])
907
        }
929 908
      }
930
    }
931
    new_matrix rows, column_count
909
      new_matrix rows, column_count
910
    end
932 911
  end
933 912

  
934 913
  #