我有10个相同大小的字段的结构.从数据文件中读取结构.
dataFile = ezread('myFile','\t');
Run Code Online (Sandbox Code Playgroud)
我得到一个特定的字段(double)并为大于2的所有行生成索引数组.
a_field = dataFile.a_field;
a = ismember(a_field,2:1000)
Run Code Online (Sandbox Code Playgroud)
我可以使用'a'从'a_field'大于2的另一个字段中获取所有行.但是如何过滤整个结构?我想有一个新结构,它保存'a_field'大于2的所有字段中的所有行.
这是一个基本问题,但我找不到一个简单的方法.
Amr*_*mro 11
结构分别存储它们的字段,因此您必须将过滤器应用于每个字段.
例如,请考虑以下结构
%# a sample structure
dataFile.a_field = randn(20,1) + 1;
dataFile.b_field = num2str((1:20)','string %d'); %'
dataFile.c_field = rand(20,1);
%# find rows where 'a_field' is bigger than 2
idx = dataFile.a_field > 2;
Run Code Online (Sandbox Code Playgroud)
现在,您有两个选项可以过滤其他字段:
使用STRUCTFUN在每个字段上应用过滤功能:
data2 = structfun(@(x) x(idx), dataFile, 'UniformOutput',false);
Run Code Online (Sandbox Code Playgroud)
写一个显式的for循环,并使用动态字段名来访问每个:
fn = fieldnames(dataFile);
for i=1:numel(fn)
data2.(fn{i}) = dataFile.(fn{i})(idx);
end
Run Code Online (Sandbox Code Playgroud)
或者,我们可以将结构转换为cellarray,然后将切片应用于整个事物:
%# cellarray
C = struct2cell(dataFile);
C = [num2cell(C{1}) cellstr(C{2}) num2cell(C{3})];
%# filter rows from all columns
idx = vertcat(C{:,1}) > 2;
C_filtered = C(idx,:)
Run Code Online (Sandbox Code Playgroud)
在这种情况下的结果:
>> C_filtered
C_filtered =
[3.0034] ' string 5' [ 0.53406]
[2.4158] 'string 11' [ 0.18971]
[2.0289] 'string 13' [ 0.14761]
[ 2.458] 'string 14' [0.054974]
[2.7463] 'string 16' [ 0.56056]
Run Code Online (Sandbox Code Playgroud)