在具有包含随机元素的字段的结构中选择单元格

时间:2015-06-08 01:13:10

标签: arrays matlab struct cells

如果有人能回答这个问题,我真的很感激。我问了很多人,却找不到一个好的答案。

DATA = struct ('Direction',{[1,1,1,1],[1,1,2,1],[2,2,2,2,2],[2,2,2,2,1,2],[2,2,2,2],[1,4,3,5,2]); 

我有这个结构,我使用以下代码来指定具有特定方向的代码:

DATA = DATA(arrayfun(@(x) sum(x.Direction == 2) + 1 >= numel( x.Direction ), DATA))
DATA = DATA(arrayfun(@(x) sum(x.Direction == 1) + 1 >= numel( x.Direction ), DATA))

这将允许我仅选择以2作为方向的单元格,并允许一个不同的数字,如[2,2,2,2,1,2]。

我只是想知道是否有办法选择随机方向的细胞?即。 [1,4,3,5,2](元素是随机的,可能包含也可能不包含1或/和2)

ps:

我不知道怎么写它但是我希望有一个代码可以比较矩阵元素,逐个元素(就像我上面所说的那样)和到达一个不是1或2的元素的时刻,它选择它是随机的!意味着随机矩阵可以有1和/或2,但代码应该跳过它,直到它到达非1或2元素。

只是为了澄清:

我有3个条件

((1))该字段的所有元素都是1,最多一个元素不是1并且是2.

((2))或该字段的所有元素均为2,最多一个元素不是2且为1。

((3))最后元素是随机的,但它们仍然可以有很多1和2,这只是偶然的。

选择“随机”我的意思是选择第三类。我的代码适用于前两个类别,但对于第三个类别,它删除了一些实际上是随机的矩阵,但是由于代码只允许一个不同的元素,因此有多个矩阵为1和/或2

谢谢。

1 个答案:

答案 0 :(得分:1)

鉴于类别3在类别1或类别2中只是,我们可以通过几种方式找出属于第3类的元素。我们可以得到类别1和2的索引并从所有索引的集合中删除它们,或者我们可以反转用于选择类别1和2的逻辑。

方法1

%// Category 2
cat2Indices = find(arrayfun(@(x) sum(x.Direction == 2) + 1 >= numel( x.Direction ), DATA));
DATA2 = DATA(cat2Indices);
%// Category 1
cat1Indices = find(arrayfun(@(x) sum(x.Direction == 1) + 1 >= numel( x.Direction ), DATA));
DATA1 = DATA(cat1Indices);
%// Category 3
cat3Indices = [1:length(DATA)];
cat3Indices = setdiff(cat3Indices, cat1Indices);
cat3Indices = setdiff(cat3Indices, cat2Indices);
DATA3 = DATA(cat3Indices);

这只保存前两个类别的指数,并计算这些指数与DATA中所有指数列表之间的集合差异。

方法2

%// Category 2
DATA2 = DATA(arrayfun(@(x) sum(x.Direction == 2) + 1 >= numel( x.Direction ), DATA))
%// Category 1
DATA1 = DATA(arrayfun(@(x) sum(x.Direction == 1) + 1 >= numel( x.Direction ), DATA))
%// Category 3
DATA3 = DATA((arrayfun(@(x) sum(x.Direction == 1) + 1 < numel(x.Direction), DATA)) & ...
            (arrayfun(@(x) sum(x.Direction == 2) + 1 < numel(x.Direction), DATA)))

我已将每个不等式从>=更改为<并执行逻辑AND以确保两个不等式成立。

另请注意,您的功能并不能完全符合您的文字说明。对于类别1,您说:

  

((1))该字段的所有元素都是1,最多一个元素不是1且为2。

但您的代码会接受[1 1 1 1 5]。如果排除这种可能性很重要,则需要更改逻辑。