Arrays MATLAB删除按顺序重复的行
我正在尝试删除按顺序重复的行。我只有两个可能的值,分别是0和1。我有nXm,其中n表示可能的位数,m对于我的问题并不重要。我的目标是找到一个矩阵,它是nX(m-a)。具有按顺序包含重复项的属性的行a。例如: 我的矩阵是:Arrays MATLAB删除按顺序重复的行,arrays,matlab,matrix,Arrays,Matlab,Matrix,我正在尝试删除按顺序重复的行。我只有两个可能的值,分别是0和1。我有nXm,其中n表示可能的位数,m对于我的问题并不重要。我的目标是找到一个矩阵,它是nX(m-a)。具有按顺序包含重复项的属性的行a。例如: 我的矩阵是: A=[0 1 0 1 0 1; 0 0 0 1 1 1; 0 0 1 0 0 1; 0 1 0 0 1 0; 1 0 0 0 1 0] 我想删除0中按顺序重复的行。在这个问题中,我们假设t是3。所以我想要矩阵,它: B=[0 1 0 1 0 1;
A=[0 1 0 1 0 1;
0 0 0 1 1 1;
0 0 1 0 0 1;
0 1 0 0 1 0;
1 0 0 0 1 0]
我想删除0中按顺序重复的行。在这个问题中,我们假设t是3。所以我想要矩阵,它:
B=[0 1 0 1 0 1;
0 0 1 0 0 1;
0 1 0 0 1 0]
删除第2行和第5行
我可能需要使用diff.,因此您希望删除至少包含
t
零的A
行
一行怎么样
B = A(~any(conv2(1,ones(1,t),2*A-1,'valid')==-t, 2),:);
工作原理:
A
转换为双极形式(2*A-1
)t
one(conv2(…)
)卷积每一行-t
(~any(…))
的行。出现-t
表示a
对应行中的t
零序列t
行的行,只需将-t
更改为t
:
B = A(~any(conv2(1,ones(1,t),2*A-1,'valid')==t, 2),:);
因此,您希望删除序列中至少包含
t
零的A
行
一行怎么样
B = A(~any(conv2(1,ones(1,t),2*A-1,'valid')==-t, 2),:);
工作原理:
A
转换为双极形式(2*A-1
)t
one(conv2(…)
)卷积每一行-t
(~any(…))
的行。出现-t
表示a
对应行中的t
零序列t
行的行,只需将-t
更改为t
:
B = A(~any(conv2(1,ones(1,t),2*A-1,'valid')==t, 2),:);
使用字符串的方法怎么样?这当然不如Luis Mendo的方法,直接处理数值数组,但它的思路有点跳出了框框。这种方法的基础是,我认为每一行的<代码> a <代码>是一个唯一的字符串,并且我可以通过正则表达式搜索每个字符串来生成一个0串。
A=[0 1 0 1 0 1;
0 0 0 1 1 1;
0 0 1 0 0 1;
0 1 0 0 1 0;
1 0 0 0 1 0];
t = 3;
B = sprintfc('%s', char('0' + A));
ind = cellfun('isempty', regexp(B, repmat('0', [1 t])));
B(~ind) = [];
B = double(char(B) - '0');
我们得到:
B =
0 1 0 1 0 1
0 0 1 0 0 1
0 1 0 0 1 0
解释
- 第1行:将矩阵
的每一行转换为由0和1组成的字符串。每行成为单元数组中的一个单元。这将使用未记录的函数来促进此单元格数组转换A
- 第2行:我用来查找
长的0字符串。我首先使用创建一个搜索字符串,该字符串满0,并且t
长。之后,我确定此单元格数组中的每一行是否包含此字符序列(即t
)。该函数帮助我们执行正则表达式,并返回单元格数组中每个单元格的任何匹配位置。或者,您可以将该函数用于更新版本的MATLAB,以加快计算速度,但我选择了000….
,以便该解决方案与大多数MATLAB发行版兼容 继续,regexp/strfind的输出是一个由元素组成的单元格数组,其中每个单元格报告我们找到特定字符串的位置。如果我们有一个匹配项,那么输出中应该至少报告一个位置,因此我检查是否有任何匹配项为空,这意味着这些是我们不想删除的行。为了从regexp
中删除行,我想将其转换为a
数组,因此这是一个确定空单元格的调用。因此,此行返回一个逻辑
逻辑数组,其中0表示删除该行,1表示不删除该行
- 第3行:我从第2行取
逻辑
数组,然后反转它,因为这才是我们真正想要的。我们使用这个倒排数组来索引单元格数组并删除这些字符串
- 第4行:输出仍然是一个单元格数组,所以我将其转换回字符数组,最后转换回数字数组
- 使用字符串的方法如何?这当然不如Luis Mendo的方法,直接处理数值数组,但它的思路有点跳出了框框。这种方法的基础是,我认为每一行的<代码> a <代码>是一个唯一的字符串,并且我可以通过正则表达式搜索每个字符串来生成一个0串。
A=[0 1 0 1 0 1;
0 0 0 1 1 1;
0 0 1 0 0 1;
0 1 0 0 1 0;
1 0 0 0 1 0];
t = 3;
B = sprintfc('%s', char('0' + A));
ind = cellfun('isempty', regexp(B, repmat('0', [1 t])));
B(~ind) = [];
B = double(char(B) - '0');
我们得到:
B =
0 1 0 1 0 1
0 0 1 0 0 1
0 1 0 0 1 0
解释
- 第1行:将矩阵
的每一行转换为由0和1组成的字符串。每行成为单元数组中的一个单元。这将使用未记录的函数来促进此单元格数组转换A
- 第2行:我用来查找
长的0字符串。我首先使用创建一个搜索字符串,该字符串满0,并且t
长。之后,我确定此单元格数组中的每一行是否包含此字符序列(即t
)。该函数帮助我们执行正则表达式,并返回单元格数组中每个单元格的任何匹配位置。或者,您可以将该函数用于更新版本的MATLAB,以加快计算速度,但我选择了000….
,以便该解决方案与大多数MATLAB发行版兼容 继续,regexp/strfind的输出是一个由元素组成的单元格数组,其中每个单元格报告我们找到特定字符串的位置。如果我们有一个匹配项,那么输出中应该至少报告一个位置,因此我检查是否有任何匹配项为空,这意味着这些是我们不想要的行regexp