【问题标题】:Choosing cells in a structure with fields that contain random elements在具有包含随机元素的字段的结构中选择单元格
【发布时间】:2015-08-22 09:11:23
【问题描述】:

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

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或/和2)

ps:

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

澄清一下:

我有 3 个条件

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

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

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

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

谢谢。

【问题讨论】:

  • 我不知道怎么写,但我想要一个代码,可以逐个元素地比较矩阵元素(就像我上面的那样),以及到达一个不是的元素的时刻1或2,它选择它作为随机!这意味着随机矩阵可以有 1 和/或 2,但代码应该跳过它,直到它到达非 1 或 2 元素。谢谢
  • “随机选择”是什么意思?
  • 我有 3 个条件((1))要么该字段的所有元素都是 1,最大一个元素不是 1 并且是 2。((2))或该字段的所有元素是 2,最大一个元素不是 2 并且是 1.((3)) 最后元素是随机的,但它们仍然可以有许多 1 和 2,这只是偶然。选择“随机”是指选择第三类。我的代码适用于前两个类别,但对于第三个类别,它删除了一些实际上是随机但具有多个元素 1 和/或 2 的矩阵,因为代码只允许一个不同的元素
  • 第 3 类不就是不在第 1 类或第 2 类中的任何东西吗?
  • 是的,这是真的,但我正在制作结构,我有限的知识说你可以减去结构,有没有办法做到这一点?谢谢

标签: arrays matlab struct cells


【解决方案1】:

鉴于类别 3 只是类别 1 或类别 2 中的任何,我们可以通过几种方式确定哪些元素属于类别 3。我们可以获取类别 1 和类别 2 的索引并将它们从所有索引集合中移除,或者我们可以反转用于选择类别 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)))

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


另请注意,您的函数并不能完全按照您的文本描述所说的那样做。对于第 1 类,您说:

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

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

【讨论】:

  • 非常感谢。它工作得很好。关于最后一个注释,我的矩阵设置方式是,对于前两个类别,可以不同的一个元素必须分别为 2 和 1,因此代码适用于前两个类别,而您的代码对于第 3 个类别来说是惊人的。非常感谢。 @烧杯
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-09
  • 1970-01-01
  • 2019-12-14
  • 1970-01-01
  • 2013-08-04
  • 2012-06-26
  • 2013-04-07
相关资源
最近更新 更多