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

Choosing cells in a structure with fields that contain random elements

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

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

我只是想知道是否有办法选择随机方向的单元格? IE。 [1,4,3,5,2](元素是随机的,可能包含也可能不包含 1 or/and 2)

ps:

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

澄清一下:

我有3个条件

((1)) 要么该字段的所有元素都是 1,其中最大一个元素不是 1 而是 2。

((2)) 或该字段的所有元素均为 2,其中最大一个元素不是 2 而为 1。

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

by selecting as "random" 我的意思是选择第三类。我的代码适用于前两个类别,但对于第三个类别,它删除了一些实际上随机但具有多个元素的矩阵 1 and/or 2 因为代码只允许一个不同的元素

谢谢。

鉴于类别 3 只是类别 1 或类别 2 中 的任何内容,我们可以通过几种方式找出哪些元素属于类别 3。我们可以获取类别 1 和类别 2 的索引并将它们从所有索引的集合中删除,或者我们可以反转用于 select 类别 1 和类别 2 的逻辑。

方法一

%// 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 中所有索引列表之间的集合差异。

方法二

%// 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)) either all the elements of the field are 1 with maximum one element that is not 1 and is 2.

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