我想使用类似于下面代码的结构来存储多个测量数据(元数据和值)。
Data.CHANNEL
字段的第1列的大小 - 或执行length(STRUCTURE(1).Data.CHANNEL(:,1))
之类的操作 - 而不运行for
循环?感谢您的帮助!
% Example Data
x1= (1:100);
x2= (1:105);
x3= (1:99);
% Fill structure usually over results(i) in a for loop
STRUCTURE = struct;
STRUCTURE(1).Title = 'NAME 1';
STRUCTURE(1).Data.CHANNEL = repmat(x1, 3, 1)';
STRUCTURE(2).Title = 'NAME 2';
STRUCTURE(2).Data.CHANNEL = repmat(x2, 3, 1)';
STRUCTURE(3).Title = 'NAME 3';
STRUCTURE(3).Data.CHANNEL = repmat(x3, 3, 1)';
save('STRUCTUREFILE','STRUCTURE')
S=load('STRUCTUREFILE.mat');
% How to get e.g all lengths / sizes of the first Channel for all three STRUCTURES (measurements)?
S.STRUCTURE(1).Data.CHANNEL(:,1)
答案 0 :(得分:0)
这个问题可以解决你的问题。
data_subfield={(STRUCTURE.Data.CHANNEL)};
data_field_size=cellfun(@(x) size(x),data_subfield,'UniformOutput',0)
简单示例:
CODE:
a(1).data=[10,20,30];
a(2).data=30;
a(3).data=[1,20];
zzz=cellfun(@(x) length(x),{(a.data)},'UniformOutput',0)
输出:
zzz =
[3] [1] [2]
答案 1 :(得分:0)
@ASantosRibeiro说对了。这是另一种方法,也回答了第二个问题。
data = struct2cell(S.STRUCTURE);
% // Extract the CHANNEL components only
dataChannel = [data(2:2:numel(data))];
dataChannelStruct = cell2mat(dataChannel);
% // Question #1
lengthOfEach = arrayfun(@(x) size(x.CHANNEL, 1), dataChannelStruct);
% // Question #2
firstColumnOfEach = arrayfun(@(x) x.CHANNEL(:,1), dataChannelStruct, 'UniformOutput', false);
按照你的例子,最后两行的输出是:
lengthOfEach =
100 105 99
firstColumnOfEach =
[100x1 double] [105x1 double] [99x1 double]
注意:这假设Title
是第一个,后面是Data.CHANNEL
。如果您颠倒顺序,或者在结构中添加任何其他内容,则代码将无效。