从 MATLAB 元胞数组中矢量化提取列表

Vectorized extracting a list from MATLAB Cell Array

我有一个双索引 MATLAB 元胞数组 (AllData{1:12,1:400}),其中每个元素都是一个结构。我想从此结构中提取值列表。

例如,我想做这样的事情来从这个结构中获得一个包含 12 个值的列表

MaxList = AllData{1:12,1}.MaxVal;

出现错误

Expected one output from a curly brace or dot indexing expression, but there were 12 results

我可以循环执行此操作,但更喜欢矢量化:

clear MaxList 
for i=1:12    
   MaxList(i) = AllData{i,1}.MaxVal; 
end

如何对其进行矢量化?

如果所有结构都是标量且具有相同的字段,最好避免元胞数组并直接使用结构数组。例如,

clear AllData
AllData(1,1).MaxVal = 10;
AllData(1,2).MaxVal = 11;
AllData(2,1).MaxVal = 12;
AllData(2,2).MaxVal = 13;
[AllData(:).OtherField] = deal('abc');

定义一个 2×2 结构数组。然后,你想要的可以简单地完成

result = [AllData(:,1).MaxVal];

如果你真的需要一个标量结构元胞数组,比如

clear AllData
AllData{1,1} = struct('MaxVal', 10, 'OtherField', 'abc');
AllData{1,2} = struct('MaxVal', 11, 'OtherField', 'abc');
AllData{2,1} = struct('MaxVal', 12, 'OtherField', 'abc');
AllData{2,2} = struct('MaxVal', 13, 'OtherField', 'abc');

您可以使用这两个步骤:

tmp = [AllData{:,1}];
result = [tmp.MaxVal];

以上述答案为起点,还可以从元胞数组结构中提取二维向量数组。在 2d AllData 元胞数组的每个元素中,都有一个 2048 元素的向量,称为 DataSet。以下命令会将所有这些向量提取到一个二维数组中:

tmp = [AllData{:,1}];
len = length(tmp(1).DataSet); % Gets the length of one vector of DataSet
tmp2 = [tmp.DataSet];  % Extracts all vectors to a large 1-d array
AllDataSets = reshape(tmp2,len,[])';  % Reshapes into a 2d array of vectors