l oop, который перебирает операторы if, где все 3 отдельных индекса изменяются | все возможные заявления - PullRequest
1 голос
/ 02 апреля 2020

TL / DR: перевод операторов if в компакт для l oop, который генерирует операторы if, проблема заключалась в изменении индекса. Я решил это после того, как полностью написал вопрос:).

Привет всем, это мой первый пост. В настоящее время я изучаю matlab, одна из задач которого состоит в том, чтобы обнаружить равнобедренный треугольник (Простая логика c, просто чтобы узнать операторы if, код не проверяет, находятся ли длины сторон за пределами треугольника). Для моего любопытства я пытался выяснить, как я мог бы использовать для l oop для генерации операторов if, ниже приведен код, который я хочу преобразовать в a для l oop.


    sideLength = [20 4 3]; %lengths of the sides

    if (sideLength(1) == sideLength(2)) && (sideLength(2) ~= sideLength(3)) %if side 1 and 2 are equal and 2 %does not equal 3
        disp('Isosceles');
        if (sideLength(2) == sideLength(3)) && (sideLength(3) ~= sideLength(1)) %if side 2 and 3 are equal %and side 3 does not equal 1
            disp('Isosceles');
            if (sideLength(3) == sideLength(1)) && (sideLength(1) ~= sideLength(2)) %if side 3 and 1 are %equal and side 1 does not equal side 2
                disp('Isosceles');
            end
        end
    end

первая итерация должна быть, если сторона (1) == сторона (2) и сторона (2) не равны стороне (3)

вторая итерация, если сторона (2) == сторона (3) и сторона (3) не равны стороне (1)

третья итерация, если сторона (3) == сторона (1) и сторона (1) ) не равняется (2)

Я хочу изменить этот код ^ на a для l oop, который повторяет каждый оператор if. Я попытался решить, как сохранить индексы внутри длины вектора при автоматическом изменении. Вот что я пробовал до сих пор.


    %vector with containing lengths of sides
    sideLength = [1 2 3];
    %This is to keep track of which if statement we are at
    ifStatement=["a" "b" "c"];

    for i=1:length(sideLength) %for loop that iterates 3 times
        %each iteration I want the if statement to change to create the same if
        %statements that are in the first set of code.

        %if statement below has been commented out for now
        %if sideLength(i) == sideLength(mod((i+1),(6-i))) %commented out this to use a print and work out

        fprintf('If statement %s equals if side(%d) == side(%d)\n', ifStatement(i), i, mod((i+1),(6-i)))
        %the mod((i+1),(6-i))) code equates to remainder of (1+1) / (6-1) = 2/5 = 2 (remainder), next 
        %iteration is remainder of (2 + 1) / (6-2) = 3/4 = 3 (remainder), last iteration = 1.
    end

Это результат вышеприведенного кода.

    If statement a equals if side(1) == side(2)
    If statement b equals if side(2) == side(3)
    If statement c equals if side(3) == side(1)

Я не могу понять, как поместить оператор && и сделать его go

Если оператор A равен, если сторона (1) == сторона (2) и сторона (2) не равны сторона (3)

Если оператор B равен, если сторона ( 2) == сторона (3) и сторона (3) не равны сторона (1)

Если выражение c равно, если сторона (3) == сторона (1) и сторона (1) не равна сторона (2)

Потратив долгое время, пытаясь составить уравнение / все эти другие возможные сверхсложные способы его решения и Написание этого поста я решил, как решить эту проблему. Я понимаю, что это может быть просто для большинства из вас, но я все равно опубликую это и напишу, как решить эту проблему. Я также хотел бы отметить, что в настоящее время я изучаю python и matlab одновременно, я начал их 5 недель или go во время обучения в университете. Я пытался перевести это решение по модулю из python в код Matlab, из-за которого я запутался. Я собираюсь опубликовать это с моим ответом в надежде помочь другим учиться.

1 Ответ

1 голос
/ 02 апреля 2020

Вот решение моей проблемы

    %vector with lengths
    sideLength = [1 2 3];
    %This is to keep track of which if statement we are at
    ifStatement=["a" "b" "c"];

    for i=1:length(sideLength) %for loop that iterates 3 times


        fprintf('If statement %s equals if (side(%d) == side(%d)) and (side(%d) ~= side(%d)) \n',...
            ifStatement(i), i, (mod((i),3)+1), (mod((i),3)+1), (mod((i+1),3)+1))
    end

Это дает вывод:

    If statement a equals if (side(1) == side(2)) and (side(2) ~= side(3)) 
    If statement b equals if (side(2) == side(3)) and (side(3) ~= side(1)) 
    If statement c equals if (side(3) == side(1)) and (side(1) ~= side(2)) 

Проблема была в моем понимании мод. В Python индексы начинаются с 0, в matlab они начинаются с 1 и должны go увеличиваться в натуральных числах. Я действительно не думал, что смогу выполнить операцию мода, а затем добавить 1 к ответу, чтобы обойти проблему с 0 в качестве индекса.

Первоначально я пытался найти число, которое могло бы вычесть из него индекс, чтобы при делении индекса на него равнялся желаемому шаблону. Вся причина этого состояла в том, чтобы попытаться избежать того, чтобы индекс был чем-то вроде 3/3 = 0, а затем имел ошибку.

Решением этой проблемы было добавление 1 к ответу результата функции по модулю. Это означало, что если ответ по модулю был 0, то он был бы преобразован в индекс (1).

    mod((i+1),(6-i))) %original attempt
    %iteration 1 = the remainder of (1+1) / (6-1) = (2)/(5) = remainder 2
    %iteration 2 = the remainder of (2+1) / (6-2) = (3)/(4) = remainder 3
    %iteration 3 = the remainder of (3+1) / (6-3) = (4)/(3) = remainder 1

    %The above was far too complicated when trying to use the same index number to solve     
    %for different patterns.

    %Below is the solution

    (mod((i),3)+1) %solved for middle part of if statement
    %iteration 1 = the remainder of (1/3) + 1 = 2
    %iteration 2 = the remainder of (2/3) + 1 = 3
    %iteration 3 = the remainder of (3/3) + 1 = 1
    %what solved this issue was understanding that I could put plus 1 outside of the mod 
    %operation to keep the indexes above 0 and solve the problem.


    %The last part of the if statement I wanted to give the pattern of 3, 1, 2.
    % to solve this I looked at (mod((i),3)+1). If I wanted to change that 
    %pattern from 2, 3, 1 I could simply add 1 at the point where the remainder was being 
    %calculated.
    (mod((i+1),3)+1) %solved for last part of if statement

    % pattern Iteration 1 (mod(1+1)/3) + 1 = (2) + 1 = 3
    % pattern Iteration 2 (mod(2+1)/3) + 1 = (0) + 1 = 1
    % pattern Iteration 3 (mod(3+1)/3) + 1 = (1) + 1 = 2


Это концептуализируется как часы. каждое число на часах одинаково, когда делится на длину часов и смотрит на остаток.


    First hand on the clock will always  be 1. 1/3 = r.1 || 4/3 = r.1 || 7/3 = r.1 
    Second hand on the clock will always be 2. 2/3 = r.2 || 5/3 = r.2 || 8/3 = r.2
    Third hand on the clock will always  be 0. 3/3 = r.0 || 6/3 = r.0 || 9/3 = r.0
                  13
                  10
                  7
                  4  
                  1
    15, 12, 9, 6, 3 2, 5, 8, 11, 14

Если я хотел составить схему из 1, 2 и 3, мне нужно было добавить 1 к ответу приведенного выше уравнения по модулю, чтобы оно имело диапазон от 1 до 3. Затем определите, какие с чего начать индекс, чтобы получить нужный шаблон.

т.е. шаблон 2, 3, 1

    %iteration 1 = the remainder of (1/3) + 1 = 2
    %iteration 2 = the remainder of (2/3) + 1 = 3
    %iteration 3 = the remainder of (3/3) + 1 = 1

т.е. шаблон 3, 1, 2

    % pattern Iteration 1 (mod(1+1)/3) + 1 = (2) + 1 = 3
    % pattern Iteration 2 (mod(2+1)/3) + 1 = (0) + 1 = 1
    % pattern Iteration 3 (mod(3+1)/3) + 1 = (1) + 1 = 2

Я надеюсь, что это хорошее объяснение, это довольно простая проблема, когда на нее смотрят так, но когда я пытался решить ее с помощью уравнений для выработки первого метода, это было не просто.

...