我正在使用MATLAB。我有非常大的稀疏矩阵,我想在这个矩阵的每一列上执行一个logical
或bsxfun
。有一个单一的for
循环,其中logical
的单一操作是填充一个稀疏矩阵。在这里,我包含了一个带有一些假小数据的示例函数,以查看我正在尝试做什么;
graph_temp
和com_mat
要大得多,大约有1M行和列,并且代码对for
循环非常慢。这里还有另一个相关的问题,但我还没有理解背后的理论,看看我是否可以将这些解决方案应用到这个问题。
我想要么写一个mex
c++函数,要么尝试得到某种嵌套的arrayfun
,以便每个logical
/bsxfun
操作被称为更大函数的子程序,以避免for循环瓶颈。
我不确定我是否一直遵循您的代码。那么,为了确保com_mat(ii,jj)
等于com(ii) ~= com(jj)
吗?
如果是,请尝试以下选项
com_mat = bsxfun( @ne, com, com' ); %' creates entire matrix at once
com_mat = graph_temp .* com_mat; % do the masking
既然你在处理稀疏矩阵,为什么不利用它
[ii jj] = find( graph_temp );
[m n] = size( graph_temp );
com_mat = sparse( ii, jj, com(ii) ~= com(jj), m, n );
我会尝试这种方式,但我目前无法访问Matlab
arrayfun(@(i) ~isequal(A(:,i),B),1:10,'UniformOutput',false)