Objective-C中的矩阵乘法

Mr.*_*row 0 cocoa objective-c nsmutablearray matrix-multiplication

这些是我在项目中进行矩阵计算的一些代码.
它们是两个类方法和一个实例方法,用于创建矩阵并执行矩阵乘法运算.
matrics multiplication的方法效果不好,其结果是错误的.

+ (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 < 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 < aRow; i++) {
        for (int j = 0; j < bColumn; j++) {
            double sum = 0.0;
            for (int k = 0; k < 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;
}
Run Code Online (Sandbox Code Playgroud)

代码有问题吗?我该如何解决?


    //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 < 4; i++) {
        for (int j = 0; j < 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];
Run Code Online (Sandbox Code Playgroud)

@rooftop,这就是所有代码

geo*_*war 6

如果你在iOS上,你可能想要考虑GLKit中的矩阵例程