矢量化转移矩阵减少

时间:2013-05-03 20:48:28

标签: performance matlab vectorization

我正在尝试为以下迭代计算找到向导的矢量化(请查看后面的编辑):

% A is a logical matrix of size NxN
B = false(size(A));
for k1 = 1:N, for k2 = 1:N, for k3 = 1:N
        B(k1,k2) = A(k1,k2) && ~A(k1,k3) && ~A(k3,k2);
end; end; end;

我必须强调使用arrayfun(或structfuncellfun)的解决方案是不可行的,因为它们很慢,我正在寻求性能改进,而不是表现力增强。 另外,我想避免明显的:

B = A & logical((1-A)^2)

因为计算它的内存占用量是原来的17倍(我在最终碎片化的内存资源中使用大矩阵)。

一个肯定的答案(即解决方案)或一个消极的答案(即解释为什么这不起作用)都非常感谢。

稍后修改

感谢H.Muster我发现初始代码中存在错误。要进行矢量化的迭代实际上是:

% A is a logical matrix of size NxN
B = A;
for k1 = 1:N, for k2 = 1:N, for k3 = 1:N
        B(k1,k2) = B(k1,k2) && ~(A(k1,k3) && A(k3,k2));
end; end; end;

也欢迎更快的迭代(我正在研究这个,如果我发现我将发布的评论/编辑内容)。

以后编辑

对于那些对代码的目的感兴趣的人,应该计算关系图B的{​​{3}} AA(k1,k2)=true表示k1“与”k2相关(互惠不是真的)。 B(k1,k2)=true表示k1“与”k2相关,而在它们之间没有其他元素k3“,即k2是{之后的”下一个“{ {1}}。必须注意的是,如果这样定义,元素可能会受益于几个“下一个”元素,而不仅仅是一个元素。传递减少有助于将“非确定性迭代器”(接下来是一个集合,而不是单个元素)创建为由非对称transitive reduction“诱导”的集合结构。

1 个答案:

答案 0 :(得分:1)

内循环中的小矢量化将是:

for k1 = 1:N, for k2 = 1:N
    B(k1,k2) = B(k1,k2) && ~all( A(k1,:) & A(:,k2)' );
end; end;

我不确定是否有一种很好的方法可以对外循环进行矢量化。

修改

实际上,对两个内循环进行矢量化很容易:

for k1 = 1:N
    B(k1,:) = ~all( bsxfun(@and, A(k1,:), A(:,:)' ) );
end;
B = A & B;

我很确定矢量化所有内容都必须涉及矩阵乘法或三维矩阵,这会占用更多空间(假设N很大)。