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中累积数据,并存储为每个下标的单元格数组的单元格。所以,基本上,这些花括号是将输出存储为单元格的信号。