【问题标题】:Matlab: Numerical array index into a string array (without loops)Matlab:数字数组索引到字符串数组(无循环)
【发布时间】:2016-05-20 19:10:03
【问题描述】:

我正在解决 MIT OCW 的 MATLAB 入门课程中的一组问题。你可以看到它here,它是第 9 号问题,第 g.iii 部分。

我有一个包含课程最终成绩的矩阵,所有这些都在 1 到 5 之间。我还有另一个数组,其中只有从 'F''A' 的字母(按 'decreasing' 顺序)。

我知道如何更改矩阵中的元素,我想我可以为每个数字做这样的事情:

totalGrades(find(totalGrades==1)) = 'F';
totalGrades(find(totalGrades==2)) = 'E';
totalGrades(find(totalGrades==3)) = 'C';
totalGrades(find(totalGrades==4)) = 'B';
totalGrades(find(totalGrades==5)) = 'A';

那么,创建字符串数组“字母”的目的是什么?

我考虑过使用循环,但我们应该在课程的那个阶段不用循环来解决问题。

有办法吗?我很高兴知道。这是我的整个问题的代码,但我陷入了最后一个问题。

load('classGrades.mat');
disp(namesAndGrades(1:5,1:8));
grades = namesAndGrades(1:15,2:size(namesAndGrades,2));
mean(grades);
meanGrades = nanmean(grades);
meanMatrix = ones(15,1)*meanGrades;
curvedGrades = 3.5*(grades./meanMatrix);

% Verifying 
nanmean(curvedGrades)
mean(curvedGrades)

curvedGrades(curvedGrades>=5) = 5;

totalGrades = nanmean(curvedGrades,2);

letters = 'FDCBA';

非常感谢!

【问题讨论】:

  • 可能是totalGrades(find(totalGrades==1))=letters(1); 然后totalGrades(find(totalGrades==2))=letters(2); 等等...
  • 或者你可能想试试arrayfun()
  • 这将是一个很好的问题问你的教授。另见:Matrix Indexing
  • 它确实改变了一些东西,但我不知道是否需要一些额外的行来将数字转换为字符串。看看我的结果:totalGrades(totalGrades==5)=letters(5) y = 4 3 4 4 4 65 3 3 4 3 3 3 3 65 4

标签: arrays string matlab indexing numbers


【解决方案1】:

试试:

letters=['F','D','C','B','A'];
tg = [1 2 1 3 3 1];
letters(tg)

结果:

ans = FDFCCF

即使 tg(总成绩)是一个矩阵,这也有效:

letters=['F','D','C','B','A'];
tg = [1 2 1 ; 3 3 1];
result = letters(tg);
result


result =                                                                                                                                                                             

FDF                                                                                                                                                                             
CCF

编辑(简要说明):
很容易理解,当您执行letters(2) 时,您会得到字母的第二个元素(D)。

但是您也可以通过给它一个数组来从letters 中选择几个元素:letters([1 2]) 将返回第一个和第二个元素 (FD)。

因此,letters(indexesArray) 将生成一个长度与indexesArray 相同的新数组。但是,这个数组必须包含从 1 到长度为letters 的数字(否则会弹出错误)。

【讨论】:

  • 解释一下为什么会很有用,因为这是 OP 不理解的部分。
  • 非常感谢 R. Schifini,成功了。和往常一样,这是一个非常简单的解决方案。需要更多学习。
  • 您尝试使用逻辑索引将数字更改为字母,但此解决方案更多的是通过使用总成绩作为索引数组来查找字母。
猜你喜欢
  • 2018-04-14
  • 2019-09-07
  • 2014-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-28
  • 1970-01-01
相关资源
最近更新 更多