我已经搜索了论坛,没有找到足够的信息来帮助我解决这个问题。
考虑这个集合(向量单元)
A = {[1],[1 2],[2],[1 2 3],[1 2 3 4],[1 3]}我想要构造一个矩阵B
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有矢量化的解吗?
发布于 2016-10-26 23:10:39
对于单元格数组,很难避免循环或它们的近亲cellfun。我就是这样做的:
[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发布于 2016-10-26 23:55:13
是您要求的,所以这里有一个几乎*矢量化的解决方案,使用bsxfun和permute -
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(:))*:几乎是因为cellfun在cellfun('length',A)一开始就使用了,但是由于它只得到了细胞的长度,所以计算是可以忽略不计的。
此外,请注意,这种方法将使用大量的内存资源,因此可能是没有好处的,但只是尊重一个矢量化的解决方案的要求尽可能!
https://stackoverflow.com/questions/40273311
复制相似问题