Vas*_*ass 1 matlab matrix sparse-matrix adjacency-matrix bsxfun
我正在使用MATLAB.我有非常大的 稀疏矩阵,我想执行logical或bsxfun在这个矩阵中的每一列.有一个for循环,其中有一个logical填充稀疏矩阵的操作.在这里,我包含一个带有一些虚假小数据的示例函数,以查看我正在尝试做什么;
function maskMat()
graph_temp = round(rand(10,10));
tic;
com_mat = round(rand(10,10));
com = round(rand(10,1));
for ii=1:length(graph_temp)
com_mat(:,ii) = logical(com ~= com(ii));
%bsxfun works too but is slightly slower
%com_mat(:,ii) = bsxfun(@ne,com,com(ii));
end
toc;
com_mat = graph_temp .* com_mat;
graph_temp并且com_mat大约有1M行和列,并且代码对for循环来说非常慢.关于SO还有另一个相关的问题,但我还没有理解它背后的理论,看看我是否也可以将这些解决方案应用于这个问题.
我想要编写一个mexc ++函数或尝试获得某种嵌套,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
Run Code Online (Sandbox Code Playgroud)
由于您正在处理稀疏矩阵,为什么不利用它
[ii jj] = find( graph_temp );
[m n] = size( graph_temp );
com_mat = sparse( ii, jj, com(ii) ~= com(jj), m, n );
Run Code Online (Sandbox Code Playgroud)