我有一个双索引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
如何对此进行矢量化?
答案 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