MATLAB矢量化:创建邻居索引数组的单元阵列

时间:2015-04-15 20:35:34

标签: performance matlab for-loop vectorization cell-array

我有Xn点的逻辑矩阵,其中X(i, j) == 1如果ij是邻居,而0则是Y

我想创建一个单元格数组Y{i},其中包含一个数组的每个条目i1ni)点n = 10; X = (rand(n, n) < 0.5); Y = cell(1, 10); for i = 1:10 [Y{i}] = find(X(i, :)); end 的邻居。

换句话说,我想对以下内容进行矢量化:

{{1}}

2 个答案:

答案 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转置为RC这样的转换 -

[R,C] = find(X)

然后,将RC的排名与之前列出的基于accumarrayarrayfun的方法互换。

答案 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(...)等。