我有X
个n
点的逻辑矩阵,其中X(i, j) == 1
如果i
和j
是邻居,而0
则是Y
。
我想创建一个单元格数组Y{i}
,其中包含一个数组的每个条目i
(1
从n
到i
)点n = 10;
X = (rand(n, n) < 0.5);
Y = cell(1, 10);
for i = 1:10
[Y{i}] = find(X(i, :));
end
的邻居。
换句话说,我想对以下内容进行矢量化:
{{1}}
答案 0 :(得分:3)
作为一种方法,您可以使用accumarray
-
[R,C] = find(X.') %//'
Y = accumarray(C(:),R(:),[],@(x) {x})
如果你需要每个单元格都是行向量,你需要在x
添加一个转置,就像这样 -
Y = accumarray(C(:),R(:),[],@(x) {x.'})
作为另一种方法,您也可以使用arrayfun
,但我认为这不是矢量化解决方案 -
Y = arrayfun(@(n) R(C==n),1:max(C),'Uni',0)
如果您不关心每个单元格中元素的顺序,则可以避免将X
转置为R
和C
这样的转换 -
[R,C] = find(X)
然后,将R
和C
的排名与之前列出的基于accumarray
和arrayfun
的方法互换。
答案 1 :(得分:3)
这里还有一些伏都教:
Y = mat2cell(nonzeros(bsxfun(@times, X, 1:size(X,1)).').', 1, sum(X,2));
这里最重要的功能是bsxfun
。要查看代码的工作原理,我建议您观察最内层的部分结果:首先是bsxfun(@times, X, 1:size(X,1)).'
,然后是nonzeros(...)
等。