String 如何在MATLAB中添加两列?

String 如何在MATLAB中添加两列?,string,matlab,matrix,integer,octave,String,Matlab,Matrix,Integer,Octave,我正试图从MATLAB脚本中创建一个简单的文本文件,该脚本按以下顺序排列,说明整个学期教室的成绩。报名的20名学生共有20份参赛作品,其中包括5份家庭作业、一份期中成绩和一份期末成绩 CINHW1HW2HW3HW4HW5中期终稿 12345678910090.080.570.670.440.670.3 我试图添加的最后一列是“最终分数”和“字母等级”。我的代码和中添加的函数是: clc clear f1 = fopen('grades.txt', 'w'); ID = randi([1000

我正试图从MATLAB脚本中创建一个简单的文本文件,该脚本按以下顺序排列,说明整个学期教室的成绩。报名的20名学生共有20份参赛作品,其中包括5份家庭作业、一份期中成绩和一份期末成绩

CINHW1HW2HW3HW4HW5中期终稿 12345678910090.080.570.670.440.670.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
任何帮助都将不胜感激


编辑1:我忘了提了。在期末成绩中,它将家庭作业成绩、期中成绩和期末成绩相加为整数。此外,字母等级反映了最终分数的字母等级(90+=a;80+=B;70+=C;如果我正确理解了您的问题,您将希望使用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

该代码存在几个问题,最明显的是(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);
%初始化等级
N=20;
ID=randi([100000000 9999999],1,N);
HW1=100*兰特(1,N);
HW2=100*兰特(1,N);
HW3=100*兰特(1,N);
HW4=100*兰特(1,N);
HW5=100*兰特(1,N);
MD=randi([0 100],1,N);
最终值=兰迪([0 100],1,N);
FG=(.2*(HW1+HW2+HW3+HW4+HW5))+(.4*MD)+(.4*最终版本);
%计算字母等级
LG=repmat({'F'},大小(FG));
I=FG>90;LG(I)=repmat({'A'},和(I),1);
I=FG 80;LG(I)=repmat({'B'},和(I),1);
I=FG 70;LG(I)=repmat({'C'},和(I),1);
%写入文件
T=类别(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);

您应该重写
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])
给予


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

请尝试创建最简单的示例。我相信您可以精简代码,直到出现
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