【问题标题】:MATLAB: Use values in double array to determine values in a cell array of stringsMATLAB:使用双精度数组中的值来确定字符串元胞数组中的值
【发布时间】:2025-12-02 16:40:01
【问题描述】:

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

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

得分 80 或以上的每个人都获得“A”。因此,如果双精度数组的 (1,1) 包含 84,则元胞数组的 (1,1) 应为“A”。假设细分为 > 80 = 'A', 50 = 'B',否则为 'C'。

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

【问题讨论】:

  • 休息为“F”?太粗鲁了?
  • 我编辑了帖子以进一步阐明分级结构。

标签: arrays matlab vectorization cell-array


【解决方案1】:

这里有一个 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'   

【讨论】:

  • 这太棒了!我特别喜欢如何灵活地改变派系。如果我添加更多派系,我是否还需要更改 rank = sum(bsxfun(@ge,arr,permute(factions,[1 3 2])),3); 中最后的“3”?
  • @user1205901 不,只需编辑派系数组,剩下的代码会处理所有事情!
  • 很酷,很抱歉打扰另一个问题,但如果有一天我想更改实际成绩(例如,将“A”更改为“非常好”,将“B”更改为“好”,以及'C' 到 'Fail'),我可以简单地编辑 out = reshape(cellstr(char(max(rank(:))-rank(:)+'A')),size(arr)) 吗?还是我需要采取不同的方法?