MATLAB:使用double数组中的值来确定字符串

时间:2015-11-22 13:46:00

标签: arrays matlab vectorization cell-array

我有一个597x4双数组,构成一个主题的学生分数。该数组中的每个值都在0到100之间。

我想创建一个597x4单元格的字符串数组,其中每个单元格都包含一个连接到double数组中等效位置的字符串。

每个获得80分或以上成绩的人都会获得A'。因此,如果双数组的(1,1)包含84,那么(1,1)的单元阵列应该是' A'。让我们说故障是> 80 =' A',< 80但是> 50 =' B',否则' C'。

我意识到这可以通过循环轻松完成,但是有更优雅的方式吗?这是在MATLAB中,但最终我想将值粘贴到Excel文件中。

1 个答案:

答案 0 :(得分:2)

这是一个bsxfun和一些重塑 -

factions = [0,30,50,80] %// Edit this if you want more factions
remarks = {'Doomed','Fail','Good','Very good'}; %// Editable too

rank = sum(bsxfun(@ge,arr,permute(factions,[1 3 2])),3);
out = reshape(cellstr(char(max(rank(:))-rank(:)+'A')),size(arr))
out_remarks = remarks(rank)

示例输入,输出 -

arr =
     3    81    73    38    88
    56    90    58    94    94
    31    60     3    83    67
    94    89    45    85    21
    99    95    65    38    66
    29    55    53    60     8
factions =
     0    30    50    80
out = 
    'D'    'A'    'B'    'C'    'A'
    'B'    'A'    'B'    'A'    'A'
    'C'    'B'    'D'    'A'    'B'
    'A'    'A'    'C'    'A'    'D'
    'A'    'A'    'B'    'C'    'B'
    'D'    'B'    'B'    'B'    'D'
out_remarks = 
    'Doomed'       'Very good'    'Good'      'Fail'         'Very good'
    'Good'         'Very good'    'Good'      'Very good'    'Very good'
    'Fail'         'Good'         'Doomed'    'Very good'    'Good'     
    'Very good'    'Very good'    'Fail'      'Very good'    'Doomed'   
    'Very good'    'Very good'    'Good'      'Fail'         'Good'     
    'Doomed'       'Good'         'Good'      'Good'         'Doomed'