首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向细胞扩展cells

向细胞扩展cells
EN

Stack Overflow用户
提问于 2016-10-26 22:45:35
回答 2查看 109关注 0票数 2

我已经搜索了论坛,没有找到足够的信息来帮助我解决这个问题。

考虑这个集合(向量单元)

代码语言:javascript
复制
A = {[1],[1 2],[2],[1 2 3],[1 2 3 4],[1 3]}

我想要构造一个矩阵B

代码语言:javascript
复制
B = [1 1 0 1 1 1
     0 1 0 1 1 0
     0 1 1 1 1 0
     0 0 0 1 1 0
     0 0 0 0 1 0
     0 0 0 1 1 1]

矩阵B针对彼此指定向量的隶属度。也就是说,第一行查看A,1中的第一个元素,检查它是否是其他向量的成员,如果是成员,则放置1,否则为0。

我可以使用两个for循环来实现这一点:一个在A的元素上,另一个嵌套在A的每个元素上,它检查A的每个其他成员的成员资格。

我想避免使用for循环。从A中获得B有矢量化的解吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-26 23:10:39

对于单元格数组,很难避免循环或它们的近亲cellfun。我就是这样做的:

代码语言:javascript
复制
[ii, jj] = ndgrid(1:numel(A)); % indices of all possible pairs
result = cellfun(@(x,y) all(ismember(x,y)), A(ii), A(jj)); % see if all elements in the 
    % first are present in the second
票数 2
EN

Stack Overflow用户

发布于 2016-10-26 23:55:13

是您要求的,所以这里有一个几乎*矢量化的解决方案,使用bsxfunpermute -

代码语言:javascript
复制
lens = cellfun('length',A) 
vals = [A{:}]

mask = bsxfun(@ge,lens,[1:max(vals)]')
a = nan(size(mask))
a(mask) = vals
matches =  bsxfun(@eq,a,permute(a,[3,4,1,2]));
out = bsxfun(@eq,squeeze(sum(any(matches,3),1)),lens(:))

*:几乎是因为cellfuncellfun('length',A)一开始就使用了,但是由于它只得到了细胞的长度,所以计算是可以忽略不计的。

此外,请注意,这种方法将使用大量的内存资源,因此可能是没有好处的,但只是尊重一个矢量化的解决方案的要求尽可能!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40273311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档