title: Matrix multiplication in Objective-C
body: <p>These are some code that I carried in my project to do matrix computing.<br>
  They are two class methods and one instance method that for create matrices and do the matrix multiplication operation.<br>
  The method for matrics multiplication doesn't work well, the result from it is wrong.</p>
  
  <pre><code>+ (NSMutableArray *)arrayOfWidth:(NSInteger)width andHeight:(NSInteger)height {
      return [[self alloc] initWithWidth:width andHeight:height];
  }
  
  - (id)initWithWidth:(NSInteger)width andHeight:(NSInteger)height {
      if((self = [self initWithCapacity:height])) {
          for(int i = 0; i &lt; height; i++) {
              NSMutableArray *inner = [[NSMutableArray alloc] initWithCapacity:width];
              [self addObject:inner];
          }
      }
      return self;
  }
  
  + (NSMutableArray *)matrixA:(NSMutableArray *)matrixA multiplyMatrixB:(NSMutableArray *)matrixB {
      int aRow = [matrixA count];
      int aColumn = [[matrixA objectAtIndex:0] count];
      int bRow = [matrixB count];
      int bColumn = [[matrixB objectAtIndex:0] count];
      NSMutableArray *newArray = [NSMutableArray arrayOfWidth:aRow andHeight:bColumn];
  
      for (int i = 0; i &lt; aRow; i++) {
          for (int j = 0; j &lt; bColumn; j++) {
              double sum = 0.0;
              for (int k = 0; k &lt; aColumn; k++) {
                  NSMutableArray *innerA = [matrixA objectAtIndex:i];
                  double numA = [[innerA objectAtIndex:k] doubleValue];
                  NSMutableArray * innerB = [matrixB objectAtIndex:k];
                  double numB = [[innerB objectAtIndex:j] doubleValue];
                  sum += numA * numB; 
              }
              NSNumber *result = [NSNumber numberWithDouble:sum];
              [[newArray objectAtIndex:i] insertObject:result atIndex:j];
          }
      }
      return newArray;
  }
  </code></pre>
  
  <p>Is there something wrong with the code?
  And how can I fix it?</p>
  
  <hr>
  
  <pre><code>    //First, I create a array to hold the numbers
      NSNumber *num11 = [NSNumber numberWithDouble:-2.0];
      NSNumber *num12 = [NSNumber numberWithDouble:1.0];
      NSNumber *num13 = [NSNumber numberWithDouble:-1.0];
      NSNumber *num14 = [NSNumber numberWithDouble:2.0];
      NSNumber *num21 = [NSNumber numberWithDouble:-7.0];
      NSNumber *num22 = [NSNumber numberWithDouble:0.0];
      NSNumber *num23 = [NSNumber numberWithDouble:-1.0];
      NSNumber *num24 = [NSNumber numberWithDouble:-4.0];
      NSNumber *num31 = [NSNumber numberWithDouble:-2.0];
      NSNumber *num32 = [NSNumber numberWithDouble:-1.0];
      NSNumber *num33 = [NSNumber numberWithDouble:0.0];
      NSNumber *num34 = [NSNumber numberWithDouble:-2.0];
      NSNumber *num41 = [NSNumber numberWithDouble:-3.0];
      NSNumber *num42 = [NSNumber numberWithDouble:-2.0];
      NSNumber *num43 = [NSNumber numberWithDouble:0.0];
      NSNumber *num44 = [NSNumber numberWithDouble:-3.0];
  
      NSMutableArray *temp = [NSMutableArray arrayWithObjects:num11, num12, num13, num14, num21, num22, num23, num24, num31, num32, num33, num34, num41, num42, num43, num44, nil];
  
      //Second, I create the matrix and get the elements from that array 
      for (int i = 0; i &lt; 4; i++) {
          for (int j = 0; j &lt; 4; j++) {
              double c = [[temp objectAtIndex:4*i+j] doubleValue];
              NSNumber *object = [NSNumber numberWithDouble:c];
              [[matrix objectAtIndex:i] insertObject:object atIndex:j];
          }
      }
  
      //Then, I do the multiplication for matrix and itself
      NSMutableArray *multiMatrix = [NSMutableArray matrixA:matrix multiplyMatrixB:matrix];
  
      //get all the elements from the multiMatrix
      double m11 = [[[multiMatrix objectAtIndex:0] objectAtIndex:0] doubleValue];
      double m12 = [[[multiMatrix objectAtIndex:0] objectAtIndex:1] doubleValue];
      double m13 = [[[multiMatrix objectAtIndex:0] objectAtIndex:2] doubleValue];
      double m14 = [[[multiMatrix objectAtIndex:0] objectAtIndex:3] doubleValue];
  
      double m21 = [[[multiMatrix objectAtIndex:1] objectAtIndex:0] doubleValue];
      double m22 = [[[multiMatrix objectAtIndex:1] objectAtIndex:1] doubleValue];
      double m23 = [[[multiMatrix objectAtIndex:1] objectAtIndex:2] doubleValue];
      double m24 = [[[multiMatrix objectAtIndex:1] objectAtIndex:3] doubleValue];
  
      double m31 = [[[multiMatrix objectAtIndex:2] objectAtIndex:0] doubleValue];
      double m32 = [[[multiMatrix objectAtIndex:2] objectAtIndex:1] doubleValue];
      double m33 = [[[multiMatrix objectAtIndex:2] objectAtIndex:2] doubleValue];
      double m34 = [[[multiMatrix objectAtIndex:2] objectAtIndex:3] doubleValue];
  
      double m41 = [[[multiMatrix objectAtIndex:3] objectAtIndex:0] doubleValue];
      double m42 = [[[multiMatrix objectAtIndex:3] objectAtIndex:1] doubleValue];
      double m43 = [[[multiMatrix objectAtIndex:3] objectAtIndex:2] doubleValue];
      double m44 = [[[multiMatrix objectAtIndex:3] objectAtIndex:3] doubleValue];
  
      //Or you can use the NSLog to check the result 
      NSString *lineOne = [NSString stringWithFormat:@"%f, %f, %f, %f", m11, m12, m13, m14];
      NSString *lineTwo= [NSString stringWithFormat:@"%f, %f, %f, %f", m21, m22, m23, m24];
      NSString *lineThree = [NSString stringWithFormat:@"%f, %f, %f, %f", m31, m32, m33, m34];
      NSString *lineFour = [NSString stringWithFormat:@"%f, %f, %f, %f", m41, m42, m43, m44];
  </code></pre>
  
  <p>@rooftop, that's all the code </p>