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



我正在使用MATLAB。我有非常大的稀疏矩阵,我想在这个矩阵的每一列上执行一个logicalbsxfun。有一个单一的for循环,其中logical的单一操作是填充一个稀疏矩阵。在这里,我包含了一个带有一些假小数据的示例函数,以查看我正在尝试做什么;

<>之前maskMat()函数Graph_temp = round(rand(10,10));抽搐;Com_mat = round(rand(10,10));Com = round(rand(10,1));2 = 1:长度(graph_temp)Com_mat (:,ii) = logical(com ~= com(ii));%bsxfun也可以工作,但是稍微慢一些%com_mat(:,ii) = bsxfun(@ne,com,com(ii));结束toc;Com_mat = graph_temp .* Com_mat;之前

graph_tempcom_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)

相关内容

  • 没有找到相关文章

最新更新