1

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

函数 maskMat()
graph_temp = round(rand(10,10));
抽动;
com_mat = round(rand(10,10));
com = round(rand(10,1));
对于 ii=1:长度(graph_temp)    
    com_mat(:,ii) = 逻辑(com ~= com(ii));
    %bsxfun 也可以,但速度稍慢
    %com_mat(:,ii) = bsxfun(@ne,com,com(ii));
结尾
目录;
com_mat = graph_temp .* com_mat;

graph_temp并且com_mat更大,大约有1Mfor行和列,并且代码对循环的执行速度非常慢。关于 SO 这里还有另一个相关问题,但我还没有理解它背后的理论,看看我是否也可以将这些解决方案应用于这个问题。

我正在考虑编写一个mexc++ 函数或尝试进行某种嵌套arrayfun,以便将每个logical/bsxfun操作作为更大函数的子例程调用,以避免 for 循环瓶颈。

4

2 回答 2

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

既然您正在处理稀疏矩阵,为什么不利用它

[ii jj] = find( graph_temp );
[m n] = size( graph_temp );
com_mat = sparse( ii, jj, com(ii) ~= com(jj), m, n );
于 2013-04-25T13:01:56.700 回答
1

我会尝试这种方式,但我目前无法访问 Matlab

arrayfun(@(i) ~isequal(A(:,i),B),1:10,'UniformOutput',false)

于 2013-04-25T12:51:48.977 回答