在Matlab中对一个数组结构进行排序

4

我在Matlab中有一个数组结构StockInfo。该结构的字段如下:

StockInfo = 

      Name: {10x1 cell}
    Values: [10x6 double]
    Return: [10x1 double]

我需要根据字段ReturnStockInfo进行排序,以便在结构体中的每个数组相应地排序。有什么好的办法吗?


你的问题没有明确定义。你有一个结构体数组,每个结构体如下所示。如果你想对结构体数组进行排序,那么必须基于每个元素的标量值而不是数组来进行排序... 请澄清。 - Amro
3个回答

4

如我在上面的评论中提到的那样,你的问题不够清晰。我认为你混淆了结构体和结构体数组。这个帖子可能会有所帮助。

话虽如此,下面是一个示例,展示我认为你想做的事情。

首先,我创建了一个结构体数组并填充了一些随机数据:

% cell array of 10 names
names = arrayfun(@(k) randsample(['A':'Z' 'a':'z' '0':'9'],k), ...
    randi([5 10],[10 1]), 'UniformOutput',false);

% 10x6 matrix of values
values = rand(10,6);

% 10x1 vector of values
returns = randn(10,1);

% 10x1 structure array
StockInfo = struct('Name',names, 'Values',num2cell(values,2), ...
    'Return',num2cell(returns));

创建的变量是一个结构体数组:
>> StockInfo
StockInfo = 
10x1 struct array with fields:
    Name
    Values
    Return

每个元素是一个带有以下字段的结构:

>> StockInfo(1)
ans = 
      Name: 'Pr3N4LTEi'
    Values: [0.7342 0.1806 0.7458 0.8044 0.6838 0.1069]
    Return: -0.3818

下面的代码可以通过"return"字段对该结构体数组进行排序(每个结构体都有对应的标量值):
[~,ord] = sort([StockInfo.Return]);
StockInfo = StockInfo(ord);

结果是数组按升序排列了“返回”值:
>> [StockInfo.Return]
ans =
  Columns 1 through 8
   -0.3818    0.4289   -0.2991   -0.8999    0.6347    0.0675   -0.1871    0.2917
  Columns 9 through 10
    0.9877    0.3929

注意:struct(..)将单元数组视为特殊情况,这就是为什么上面创建了一个10x1的结构体数组,而不是在其字段中包含数组的结构体。因此,如果提供的是returns而不是num2cell(returns),则结果将不同(数组中的每个结构体都将具有包含10x1数组的“Return”字段,每个副本都是原始returns)。 - Evgeni Sergeev
注意:调用结构体数组的字段(如StockInfo.Return)会给出这些结构体元素的逗号分隔列表。因此,[StockInfo.Return]会给出一个数组。然后通过sort(..)对其进行排序,返回排列ord。要对字符串进行排序,可以使用sort({StockInfo.Name}),但目前仅适用于字符串,直到Matlab的未来版本。 - Evgeni Sergeev
1
@EvgeniSergeev:是的,感谢你的澄清。s = struct('a',{11,22});(注意这里是一个cell数组)是一种特殊语法,用于创建等价于s(1).a=11; s(2).a=22;的结构体数组。现在,当此数组进行点索引时,它会返回所谓的逗号分隔列表。因此,前面代码中的[s.a]会扩展为[s(1).a, s(2).a]。我们还可以将该列表捕获到一个cell数组{s.a}中,甚至可以将其捕获到多个输出变量[s1,s2] = s.a;中。 - Amro
非常感谢这个快速的结构体排序指南!我更喜欢使用原始代码而不是从文件交换中获取的预制品。 - Arthur Tarasov

3
您可以使用FileExchange函数 nestedSortStruct (链接) 基于字段对结构数组进行排序。
B = nestedSortStruct(A, 'Return');

1
一种仅使用内置函数的解决方案可能是:

[~, ix] = sort(StockInfo.Return);
StockInfo = struct(...
    'Name', {StockInfo.Name{ix}}, ...
    'Values', StockInfo.Values(ix), ...
    'Return', StockInfo.Return(ix));

如果你的Matlab版本较旧,不支持未使用的输出参数,请用任何未使用的标识符替换~。


第二行只需要写成 StockInfo = StockInfo(ix)。 - Trashman
@Trashman,Name是一个cell数组。如果我执行StockInfo(ix),我会得到一个cell,而我想要得到一个字符串。 - texnic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接