【问题标题】:Return a vector of Grades from if-else statements从 if-else 语句中返回 Grades 向量
【发布时间】:2017-02-10 16:30:20
【问题描述】:

我有一个 if-else if 构造,它根据 0-100 的分数给我 A、B、C、D、F 的等级。

if (mark > 100) | (mark < 0)
disp('Invalid mark');
return; % Exit from the program.
end % Of first if statement
if mark >= 80 % Mark is in range 80 - 100.
grade = 'A';
elseif mark >= 70 % Mark is in range 70 - 79.
grade = 'B'; 
elseif mark >= 60 % Mark is in range 60 - 69.
grade = 'C';
elseif mark >= 50 % Mark is in range 50 - 59.
grade = 'D'  
else % Mark is in range 0 - 44.
grade = 'F';
end
disp(grade);

现在,我有另一个长的数字标记向量(从 0 到 100),大小为 Ax1,称为“标记”。我不知道;如何通过这行代码输入每个数字标记以实现成绩的输出向量?

【问题讨论】:

    标签: matlab function if-statement for-loop


    【解决方案1】:

    您可以按照以下方式以矢量化方式进行:

    grade_names = 'FDCBA';
    th = [50 60 70 80]; % thresholds that define the grades
    marks = [75 70 33 99 88 58]; % data
    grades_num = 1 + sum(bsxfun(@ge, marks(:).', th(:) ), 1); % vector with numbers
        %  indicating grade: 1 for the first ('F'), 2 for the second ('D') etc
    grades = grade_names(grades_num);
    

    在示例中,这给出了 char 向量 od 等级

    grades =
    BBFAAD
    

    如果您更喜欢元胞数组输出,请将第一行更改为

    grade_names = {'F' 'D' 'C' 'B' 'A'};
    

    这将给

    grades =
        'B'    'B'    'F'    'A'    'A'    'D'
    

    【讨论】:

      【解决方案2】:

      试试这个:

      for i=1:length(marks) mark=marks(i);`

      后跟您的代码 并在 for 循环的末尾添加一个结尾。 您也可以将成绩放在矢量中,而不仅仅是显示它们。

      【讨论】:

        【解决方案3】:

        这是另一个与Luis Mendo 的回答略有不同的解决方案:

        if numel(find((mark > 100) | (mark < 0))) > 0
            disp('Invalid mark');
            return; % Exit from the program.
        end % Of first if statement
        %array of break points
        brkpnt = [0 50:10:80 101];
        %distance between breakpoints
        cnt = diff(brkpnt);
        %table of grades corresponding to related marks
        Grades = repelem('FDCBA', cnt);
        %the result. 1  added to mark to make indices greater than 0
        grade = Grades(mark + 1)
        

        或者你可以使用简单的矢量化形式

        grade(mark >= 80) = 'A';
        grade(mark < 80 & mark >= 70) = 'B';
        grade(mark < 70 & mark >= 60) = 'C';
        grade(mark < 60 & mark >= 50) = 'D';
        grade(mark < 50) = 'F';
        

        我将这些方法与其结果的基准进行了比较:

        -----------repelem method---
        Elapsed time is 0.00621986 seconds.
        -----------bsxfun method---
        Elapsed time is 0.022429 seconds.
        -----------simple vectorized method---
        Elapsed time is 0.0253041 seconds.
        -----------for loop method---
        Elapsed time is 7.7302 seconds.
        

        基准测试:Online Demo

        【讨论】:

        • 谢谢!我使用了简单的矢量化。我如何以单元格数组形式获得成绩。 (所以我可以将“等级”输入到结构数组中)。例如:[F] [C] [B] [A] [A]
        • 我在想 str2num 可能吗?
        • @Agnel 你可以使用cellstr。 a = 'ABCDEF'; disp(cellstr(a.'))
        猜你喜欢
        • 2021-08-31
        • 1970-01-01
        • 2020-08-20
        • 1970-01-01
        • 1970-01-01
        • 2023-02-21
        • 2013-09-09
        • 2016-07-23
        • 2020-07-30
        相关资源
        最近更新 更多