'rows' 规范在 intersect(tableA,tableB,'rows') 中做了什么
What does the 'rows' specification do in intersect(tableA,tableB,'rows')
我倒着和侧着阅读文档。对于我的生活,我无法辨别 'rows' 的效果是什么。这是我的测试代码,似乎也没有透露。
>> a=table((1:5)',{'a';'bc';'def';'gh';'i'})
a = Var1 Var2
____ _____
1 'a'
2 'bc'
3 'def'
4 'gh'
5 'i'
>> b=a([1 2 3],:)
b = Var1 Var2
____ _____
1 'a'
2 'bc'
3 'def'
>> c=a([2 3 4],:)
c = Var1 Var2
____ _____
2 'bc'
3 'def'
4 'gh'
>> intersect(b,c)
ans = Var1 Var2
____ _____
2 'bc'
3 'def'
>> intersect(b,c,'rows')
ans = Var1 Var2
____ _____
2 'bc'
3 'def'
感谢任何能对此提供说明的人。
没有。如果输入 A
和 B
是具有相同变量的 table,我们有:
Two rows that have the same values, but different names, are considered equal.
因此,默认包含 'rows'
选项。实际上tableintersect
方法(@table\intersect.m)中对intersect
的底层调用是:
[~,ia,ib] = intersect(ainds,binds,flag,'rows');
只需要用它来区分数组元素或数组行的交集。例如
A = [2 2 2; 0 0 1; 1 2 3; 1 1 1];
B = [1 2 3; 2 2 2; 2 2 0];
>> [C, ia, ib] = intersect(A,B)
C =
0
1
2
3
对
>> [C, ia, ib] = intersect(A,B, 'rows')
C =
1 2 3
2 2 2
如果您 read the documentation,对于 intersect(a,b)
表格,它说:
If A and B are tables, then intersect returns the set of rows common to both tables.
对于 intersect(a,b,'rows')
形式,它表示:
treats each row of A and each row of B as single entities and returns the rows common to both A and B.
因此,可以得出结论,对于 tables,操作是相同的,正如您所展示的那样。但是,如果使用普通的旧数组,行为会有所不同:
a = randi(10, 10)
intersect(a, a)
ans =
1
2
...
10
这里我们已经展平了数组并寻找相同的单元格。
intersect(a, a, 'rows')
ans =
9 3 ... 7
...
这里我们按行进行比较,并将结果返回为完整匹配的行,就好像数组是您在问题中显示的表格一样。
你也可以试试:
a = randi(10, 10)
b = randi(10, 10)
intersect(a, b)
intersect(a, b, 'rows')
你会发现第一种形式几乎总是得到 1 到 10,而第二种形式几乎从来没有得到任何匹配。
我倒着和侧着阅读文档。对于我的生活,我无法辨别 'rows' 的效果是什么。这是我的测试代码,似乎也没有透露。
>> a=table((1:5)',{'a';'bc';'def';'gh';'i'})
a = Var1 Var2
____ _____
1 'a'
2 'bc'
3 'def'
4 'gh'
5 'i'
>> b=a([1 2 3],:)
b = Var1 Var2
____ _____
1 'a'
2 'bc'
3 'def'
>> c=a([2 3 4],:)
c = Var1 Var2
____ _____
2 'bc'
3 'def'
4 'gh'
>> intersect(b,c)
ans = Var1 Var2
____ _____
2 'bc'
3 'def'
>> intersect(b,c,'rows')
ans = Var1 Var2
____ _____
2 'bc'
3 'def'
感谢任何能对此提供说明的人。
没有。如果输入 A
和 B
是具有相同变量的 table,我们有:
Two rows that have the same values, but different names, are considered equal.
因此,默认包含 'rows'
选项。实际上tableintersect
方法(@table\intersect.m)中对intersect
的底层调用是:
[~,ia,ib] = intersect(ainds,binds,flag,'rows');
只需要用它来区分数组元素或数组行的交集。例如
A = [2 2 2; 0 0 1; 1 2 3; 1 1 1];
B = [1 2 3; 2 2 2; 2 2 0];
>> [C, ia, ib] = intersect(A,B)
C =
0
1
2
3
对
>> [C, ia, ib] = intersect(A,B, 'rows')
C =
1 2 3
2 2 2
如果您 read the documentation,对于 intersect(a,b)
表格,它说:
If A and B are tables, then intersect returns the set of rows common to both tables.
对于 intersect(a,b,'rows')
形式,它表示:
treats each row of A and each row of B as single entities and returns the rows common to both A and B.
因此,可以得出结论,对于 tables,操作是相同的,正如您所展示的那样。但是,如果使用普通的旧数组,行为会有所不同:
a = randi(10, 10)
intersect(a, a)
ans =
1
2
...
10
这里我们已经展平了数组并寻找相同的单元格。
intersect(a, a, 'rows')
ans =
9 3 ... 7
...
这里我们按行进行比较,并将结果返回为完整匹配的行,就好像数组是您在问题中显示的表格一样。
你也可以试试:
a = randi(10, 10)
b = randi(10, 10)
intersect(a, b)
intersect(a, b, 'rows')
你会发现第一种形式几乎总是得到 1 到 10,而第二种形式几乎从来没有得到任何匹配。