Objective-C, вложенный в цикл для создания дубликатов матрицы - PullRequest
0 голосов
/ 22 марта 2019

Я работаю над приложением iOS в target-c (вычисление коэффициента инбридинга).У меня есть цикл для вложенных в цикл для создания матрицы.Я получаю странный вывод при поиске значения в матрице, поэтому я добавил несколько журналов, чтобы посмотреть, смогу ли я выяснить, что происходит.Пытаясь получить диагональное значение матрицы, я напечатал значения, используемые в расчете, в одном конкретном значении строки / столбца.Каким-то образом мой код генерирует диагональное значение дважды с двумя разными значениями.Я не могу понять, как вычисляется одно диагональное значение дважды в этом коде:

for(x = 0; x < results.count; x++) {
    //Loop through all animals to create matrix columns
    NSMutableArray *rows = [[NSMutableArray alloc] init];
    i = 0;

for (i = 0; i < results.count; i++) {
    //Loop through all animals to create matrix rows
    int maleID = [[[results objectAtIndex:i] objectAtIndex:1] intValue];
    int femaleID = [[[results objectAtIndex:i] objectAtIndex:2] intValue];
    //NSString *animalID = [[results objectAtIndex:i] objectAtIndex:3];
    //NSLog(@"animal = %@ male = %d, female = %d",animalID,maleID,femaleID);

    if (i > x){
    //Above diagonal calculation
        //If male unknow tfemale male coefficient = 0
        if (maleID==-1) {
            maleCOE = 0;
        } else {
        maleCOE = [[rows objectAtIndex:maleID] floatValue];
        }

        //If female unknown tfemale female coefficient = 0
        if (femaleID==-1) {
            femaleCOE = 0;
        } else {
        femaleCOE = [[rows objectAtIndex:femaleID] floatValue];
        }

        //Calculate breeding pair COE
        float breedingCOE = (maleCOE + femaleCOE)/2;
        [rows addObject:[NSNumber numberWithFloat:breedingCOE]];
        if (x==7 && i==15) {
            NSLog(@"femaleID = %d, maleID = %d, femaleCOE = %f, maleCOE = %f, breedingCOE = %f",femaleID,maleID,femaleCOE,maleCOE,breedingCOE);
        }

}
    if (i < x) {
        //If below diagonal, use prior calculated breedingCOE from above diagonal
        float breedingCOE = [[[columns objectAtIndex:i] objectAtIndex:x]floatValue];
        [rows addObject:[NSNumber numberWithFloat:breedingCOE]];
    }

    if (i == x) {
        //Diagnal calculation
        if (maleID==-1 || femaleID==-1) {
            //If either parents unknow = 1
            [rows addObject:[NSNumber numberWithFloat:1]];
        } else {
            //Calculate individual COE
            float indCOE = 1 + ([[[columns objectAtIndex:femaleID] objectAtIndex:maleID]floatValue]/2);
            [rows addObject:[NSNumber numberWithFloat:indCOE]];
        }
        if (i==115 && x==115) {
            NSLog(@"femaleID = %d, maleID = %d, femaleCOE = %f, maleCOE = %f, indCOE =",femaleID,maleID,femaleCOE,maleCOE);
        }
    }
}
    //NSLog(@"row %d count = %lu",x,(unsigned long)rows.count);
    NSString *str = [rows componentsJoinedByString:@", "];
    //NSLog(@"%@",str);
    //Add row to column
    [columns addObject:rows];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...