matlab向量包含,matlab – 如何找到包含向量B的至少一个元素的单元格A的向量?...

途径

使用arrayfun和ismember –

Result = A(arrayfun(@(n) any(ismember(B,A{n})),1:numel(A)))

或者使用arrayfun和bsxfun –

Result = A(arrayfun(@(n) any(any(bsxfun(@eq,B(:),A{n}),2)),1:numel(A)))

或者使用arrayfun和setdiff –

Result = A(arrayfun(@(n) numel(setdiff(B,A{n})) < numel(B),1:numel(A)))

或者使用arrayfun和intersect –

Result = A(arrayfun(@(n) ~isempty(intersect(B,A{n})),1:numel(A)))

人们也可以在这里使用cellfun,这样四个基于cellfun的对应解决方案最终会像这样 –

Result = A(cellfun(@(x) any(ismember(B,x)), A))

Result = A(cellfun(@(x) any(any(bsxfun(@eq,B(:),x),2)),A))

Result = A(cellfun(@(x) numel(setdiff(B,x)) < numel(B),A))

Result = A(cellfun(@(x) ~isempty(intersect(B,x)),A))

采取不同的路线[使用bsxfun的掩蔽能力]

不是进入那些基本上是循环方法的基于arrayfun或cellfun的方法,而是可以通过将A转换为2D数值阵列来使解决方案很多.因此,这里的想法是有一个2D数组,其中行数是A中的最大元素数,列数是A中的单元数.该数组的每一列都包含来自A和NaN的每个单元的元素会填满空地.

使用这种方法的解决方案代码看起来像这样 –

lens = cellfun('length',A); %// number of elements in each cell of A

mask = bsxfun(@ge,lens,(1:max(lens))'); %//'# mask of valid places in the 2D array

A_arr = NaN(size(mask)); %//initialize 2D array in which A elements are to be put

A_arr(mask) = [A{:}]; %// put the elements from A

%// Find if any element from B is in any element along the row or dim-3

%// locations in A_arr. Then logically index into A with it for the final

%// cell array output

Result = A(any(any(bsxfun(@eq,A_arr,permute(B,[1 3 2])),1),3));

验证

>> celldisp(Result)

Result{1} =

2 5

Result{2} =

33 77 4

Result{3} =

10 66 17 7 8 11

Result{4} =

15 41 88

标杆

对于有兴趣了解运行时性能的人来说,这是一个快速的基准测试,具有足够大的数据量 –

%// Create inputs

N = 10000; %// datasize

max_num_ele = 100; %// max elements in any cell of A

num_ele = randi(max_num_ele,N,1); %// number of elements in each cell of A

A = arrayfun(@(n) randperm(N,num_ele(n)), 1:N, 'uni', 0);

B = randperm(N,num_ele(1));

%// Warm up tic/toc.

for k = 1:100000

tic(); elapsed = toc();

end

%// Start timing all approaches

disp('************************ With arrayfun **************************')

disp('------------------------ With arrayfun + ismember')

tic

Result = A(arrayfun(@(n) any(ismember(B,A{n})),1:numel(A)));

toc, clear Result

disp('------------------------ With arrayfun + bsxfun')

tic

Result = A(arrayfun(@(n) any(any(bsxfun(@eq,B(:),A{n}),2)),1:numel(A)));

toc, clear Result

disp('------------------------ With arrayfun + setdiff')

tic

Result = A(arrayfun(@(n) numel(setdiff(B,A{n})) < numel(B),1:numel(A)));

toc, clear Result

disp('------------------------ With arrayfun + intersect')

tic

Result = A(arrayfun(@(n) ~isempty(intersect(B,A{n})),1:numel(A)));

toc, clear Result

disp('************************ With cellfun **************************')

disp('------------------------ With cellfun + ismember')

tic

Result = A(cellfun(@(x)any(ismember(B,x)), A));

toc, clear Result

disp('------------------------ With cellfun + bsxfun')

tic

Result = A(cellfun(@(x) any(any(bsxfun(@eq,B(:),x),2)),A));

toc, clear Result

disp('------------------------ With cellfun + setdiff')

tic

Result = A(cellfun(@(x) numel(setdiff(B,x)) < numel(B),A));

toc, clear Result

disp('------------------------ With cellfun + setdiff')

tic

Result = A(cellfun(@(x) ~isempty(intersect(B,x)),A));

disp('************************ With masking bsxfun **************************')

tic

lens = cellfun('length',A); %// number of elements in each cell of A

mask = bsxfun(@ge,lens,(1:max(lens))'); %//'

A_numarr = NaN(size(mask));

A_numarr(mask) = [A{:}];

Result = A(any(any(bsxfun(@eq,A_numarr,permute(B,[1 3 2])),1),3));

toc

在我的系统上获得的结果是 –

************************ With arrayfun **************************

------------------------ With arrayfun + ismember

Elapsed time is 0.409810 seconds.

------------------------ With arrayfun + bsxfun

Elapsed time is 0.157327 seconds.

------------------------ With arrayfun + setdiff

Elapsed time is 1.154602 seconds.

------------------------ With arrayfun + intersect

Elapsed time is 1.081729 seconds.

************************ With cellfun **************************

------------------------ With cellfun + ismember

Elapsed time is 0.392375 seconds.

------------------------ With cellfun + bsxfun

Elapsed time is 0.143341 seconds.

------------------------ With cellfun + setdiff

Elapsed time is 1.101331 seconds.

------------------------ With cellfun + setdiff

************************ With masking bsxfun ********************

Elapsed time is 0.067224 seconds.

可以看出,基于cellfun的解决方案比基于arrayfun的解决方案快一点!此外,基于掩码的bsxfun方法看起来很有趣,但请记住它的内存饥饿性.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值