Performance MATLAB矢量化:创建相邻索引数组的单元数组

Performance MATLAB矢量化:创建相邻索引数组的单元数组,performance,matlab,for-loop,vectorization,cell-array,Performance,Matlab,For Loop,Vectorization,Cell Array,我有一个由n点组成的逻辑矩阵X,其中X(I,j)=1如果点I和j是相邻点,反之亦然 我想创建一个单元格数组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 n=10; X=(rand(n,n)

我有一个由
n
点组成的逻辑矩阵
X
,其中
X(I,j)=1
如果点
I
j
是相邻点,反之亦然

我想创建一个单元格数组
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
n=10;
X=(rand(n,n)<0.5);
Y=单元(1,10);
对于i=1:10
[Y{i}]=find(X(i,:);
结束

作为您可以使用的一种方法-

如果需要每个单元格都是行向量,则需要在其中添加一个带有
x
的转置,如下所示-

Y = accumarray(C(:),R(:),[],@(x) {x.'})
[R,C] = find(X)
作为另一种方法,您也可以使用,但我认为这不是矢量化的解决方案-

Y  = arrayfun(@(n) R(C==n),1:max(C),'Uni',0)

如果不关心每个单元格中元素的顺序,可以避免
X
的转置,得到
R
C
,就像这样-

Y = accumarray(C(:),R(:),[],@(x) {x.'})
[R,C] = find(X)

然后,用前面列出的基于
accumarray
arrayfun
的方法交换
R
C
的位置。

这里有一些更多的巫术:

Y = mat2cell(nonzeros(bsxfun(@times, X, 1:size(X,1)).').', 1, sum(X,2));

这里最重要的功能是。为了了解代码是如何工作的,我建议您从最里面向外观察部分结果:首先是
bsxfun(@times,X,1:size(X,1))。
,然后是
非零(…)
,等等。

谢谢@Divakar,这就成功了。但在我看来,它像是巫毒!:-)您能解释一下您是如何使用accumarray的吗?我尤其没有得到
@x{x}
部分。@MGA据我所知,{x}部分根据C中的下标从R中累积数据,并存储为每个下标的单元格数组的单元格。所以,基本上,这些花括号是将输出存储为单元格的信号。