矢量化从MATLAB Cell Array中提取列表

时间:2018-01-28 22:08:31

标签: matlab vectorization matlab-struct

我有一个双索引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

如何对此进行矢量化?

2 个答案:

答案 0 :(得分:3)

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

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];

答案 1 :(得分:0)

使用上面的答案作为起点,还可以从单元阵列结构中提取二维矢量数组。在2d AllData单元阵列的每个元素中是一个名为DataSet的2048元素向量。以下命令将所有这些向量提取到2d数组:

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