我在Matlab中有一个数组结构StockInfo
。该结构的字段如下:
StockInfo =
Name: {10x1 cell}
Values: [10x6 double]
Return: [10x1 double]
我需要根据字段Return
对StockInfo
进行排序,以便在结构体中的每个数组相应地排序。有什么好的办法吗?
我在Matlab中有一个数组结构StockInfo
。该结构的字段如下:
StockInfo =
Name: {10x1 cell}
Values: [10x6 double]
Return: [10x1 double]
我需要根据字段Return
对StockInfo
进行排序,以便在结构体中的每个数组相应地排序。有什么好的办法吗?
如我在上面的评论中提到的那样,你的问题不够清晰。我认为你混淆了结构体和结构体数组。这个帖子可能会有所帮助。
话虽如此,下面是一个示例,展示我认为你想做的事情。
首先,我创建了一个结构体数组并填充了一些随机数据:
% 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
[~,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 SergeevStockInfo.Return
)会给出这些结构体元素的逗号分隔列表。因此,[StockInfo.Return]
会给出一个数组。然后通过sort(..)
对其进行排序,返回排列ord
。要对字符串进行排序,可以使用sort({StockInfo.Name})
,但目前仅适用于字符串,直到Matlab的未来版本。 - Evgeni Sergeevs = 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
[~, ix] = sort(StockInfo.Return);
StockInfo = struct(...
'Name', {StockInfo.Name{ix}}, ...
'Values', StockInfo.Values(ix), ...
'Return', StockInfo.Return(ix));
如果你的Matlab版本较旧,不支持未使用的输出参数,请用任何未使用的标识符替换~。
cell
数组。如果我执行StockInfo(ix),我会得到一个cell,而我想要得到一个字符串。 - texnic