当在非常大的矩阵中对每一行执行操作时,如何避免MATLAB中的for循环?

Vas*_*ass 1 matlab matrix sparse-matrix adjacency-matrix bsxfun

我正在使用MATLAB.我有非常大的 稀疏矩阵,我想执行logicalbsxfun在这个矩阵中的每一列.有一个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循环瓶颈.

Sha*_*hai 6

我不确定我是否一直遵守你的代码.所以,确保,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)