如题所述
第1个回答 2019-04-16
matlab里求交的函数是intersect,可惜它只能对字符串类型的元胞数组进行求交,而你这个是double类型的,所以我们的思路就是把a、b转换成字符串类型的,然后利用intersect求交,结果再转回double:
>>
a
=
{
1,
2,
[
4
15
],
[
5
23
]
}
a
=
[1]
[2]
[1x2
double]
[1x2
double]
>>
b
=
{
3,
2,
5,
[
4,
15
],
0
}
b
=
[3]
[2]
[5]
[1x2
double]
[0]
>>
as
=
cellfun(
@(
ai
)
num2str(
ai
),
a,
'UniformOutput',
false
)
as
=
'1'
'2'
'4
15'
'5
23'
>>
bs
=
cellfun(
@(
bi
)
num2str(
bi
),
b,
'UniformOutput',
false
)
bs
=
'3'
'2'
'5'
'4
15'
'0'
>>
cs
=
intersect(
as,
bs
)
cs
=
'2'
'4
15'
>>
c
=
cellfun(
@(
ci
)
str2num(
ci
),
cs,
'UniformOutput',
false
)
c
=
[2]
[1x2
double]
>>
celldisp(
c
)
c{1}
=
2
c{2}
=
4
15
我不好说这个会不会比你用for更快,如果你对性能要求很好,就只能用和C混编的技术了,用
C写一个专门对cell数组求交的mex函数,绝对比matlab快几十倍。
>>
a
=
{
1,
2,
[
4
15
],
[
5
23
]
}
a
=
[1]
[2]
[1x2
double]
[1x2
double]
>>
b
=
{
3,
2,
5,
[
4,
15
],
0
}
b
=
[3]
[2]
[5]
[1x2
double]
[0]
>>
as
=
cellfun(
@(
ai
)
num2str(
ai
),
a,
'UniformOutput',
false
)
as
=
'1'
'2'
'4
15'
'5
23'
>>
bs
=
cellfun(
@(
bi
)
num2str(
bi
),
b,
'UniformOutput',
false
)
bs
=
'3'
'2'
'5'
'4
15'
'0'
>>
cs
=
intersect(
as,
bs
)
cs
=
'2'
'4
15'
>>
c
=
cellfun(
@(
ci
)
str2num(
ci
),
cs,
'UniformOutput',
false
)
c
=
[2]
[1x2
double]
>>
celldisp(
c
)
c{1}
=
2
c{2}
=
4
15
我不好说这个会不会比你用for更快,如果你对性能要求很好,就只能用和C混编的技术了,用
C写一个专门对cell数组求交的mex函数,绝对比matlab快几十倍。