如何在MATLAB中添加两列?

时间:2017-12-01 04:42:19

标签: string matlab matrix integer octave

我正在尝试从MATLAB脚本创建一个简单的文本文件,该脚本在以下事项中排序,说明了整个学期的课堂成绩。 20名学生参加了20个参赛作品,有5个作业,中期成绩和最终成绩。

CIN HW1 HW2 HW3 HW4 HW5期中最后

123456789 100 90.0 80.5 70.6 70.4 40.6 70.3

我要添加的最后几列是“最终得分”和“字母等级”。我的代码以及添加的功能是:

clc
clear

f1 = fopen('grades.txt', 'w');

ID = randi([100000000 999999999],1,20);
HW1 = 100*rand(1,20);
HW2 = 100*rand(1,20);
HW3 = 100*rand(1,20);
HW4 = 100*rand(1,20);
HW5 = 100*rand(1,20);
MD = randi([0 100], 1,20);
Final = randi([0 100], 1,20);
FG = (.2*(HW1+HW2+HW3+HW4+HW5))+(.4*MD)+(.4*Final);
LG = getLetterGrade(FG(1,20)) 

T = [ID;HW1;HW2;HW3;HW4;HW5;MD;Final;FG;LG];

fprintf(f1,'\nStudentID\n\t HW1\t\t HW2\t\t HW3\t\t HW4\t\t HW5\t\t Midterm\t Final\t\t Final Grade\t\t Letter Grade\t\t  \r\n');
fprintf(f1,'%i\n\t %3.1f\n\t\t %3.1f\n\t\t %3.1f\n\t\t %3.1f\n\t\t %3.1f\n\t\t %3.1f\n\t\t %3.1f\n\t\t %3.2f\n\t\t %c\n\t\t  \r\n', T);
fclose(f1)



function letterGrade = getLetterGrade(FG)
if FG > 90
letterGrade = 'A';
elseif FG <= 89 && FG > 80
letterGrade = 'B';
elseif FG <= 79 && FG > 70
letterGrade = 'C';
else
letterGrade = 'F';
end
end

然而,我一直收到错误。

LG = C
error: vertical dimensions mismatch (9x20 vs 1x1)

任何帮助将不胜感激。

Edit1:我忘了提。在最终得分中,它将作业得分,中期得分和最终得分相加为整数。此外,字母等级反映了最终得分中的字母等级(90 + = A; 80 + = B; 70 + = C; <70 =失败)。

3 个答案:

答案 0 :(得分:1)

你应该重写你的getLetterGrade,以便它可以处理矢量输入并返回一个矢量:

function letterGrade = getLetterGrade (FG)

  score = [90;80;70;0];
  lg = 'ABCF';
  [m, idx] = max (FG(:).' >= score);
  letterGrade = lg(idx);

end

getLetterGrade ([100 90 80.5 70.6 70.4 40.6])

给出

ans = AABCCF

我不会将此添加到T,而是在打印函数中使用单元数组或更好的结构数组或单独的向量。

答案 1 :(得分:0)

如果我理解你的问题,你会想要使用这样的语法来加入2个新列,使用var = [new element]样式。

octave:1> g = [1 2 3 4 5]

g =   1   2   3   4   5

octave:2> x = 6

x =  6

octave:3> l = [g x]

l =  1   2   3   4   5   6

答案 2 :(得分:0)

代码有几个问题,最值得注意的是(1)LG是一个标量(大小为1x1),(2)你不能连接数字和单元格数组,以及(3)传递给的格式字符串fprintf格式不正确。此代码更正了这些问题:

% initialize grades
N = 20;
ID = randi([100000000 999999999], 1, N);
HW1 = 100*rand(1, N);
HW2 = 100*rand(1, N);
HW3 = 100*rand(1, N);
HW4 = 100*rand(1, N);
HW5 = 100*rand(1, N);
MD = randi([0 100], 1, N);
Final = randi([0 100], 1, N);
FG = (.2*(HW1+HW2+HW3+HW4+HW5))+(.4*MD)+(.4*Final);

% calculate letter grades
LG = repmat({'F'}, size(FG));
I = FG > 90;            LG(I) = repmat({'A'}, sum(I), 1);
I = FG <= 89 & FG > 80; LG(I) = repmat({'B'}, sum(I), 1);
I = FG <= 79 & FG > 70; LG(I) = repmat({'C'}, sum(I), 1);

% write to file
T = cat(1, ...
    num2cell([ID ; HW1 ; HW2 ; HW3 ; HW4 ; HW5 ; MD ; Final ; FG]), ...
    LG);
f1 = fopen('grades.txt', 'w');
fprintf(f1, 'StudentID\tHW1\tHW2\tHW3\tHW4\tHW5\tMidterm\tFinal\tFinal    Grade\tLetter Grade\t\n');
fprintf(f1, '%i\t%3.1f\t%3.1f\t%3.1f\t%3.1f\t%3.1f\t%3.1f\t%3.1f\t%3.2f\t%c\t\n', T{:});
fclose(f1);