向量化块分配超值值

时间:2014-10-08 22:50:38

标签: matlab vectorization

所以今天我遇到了这个bug

A_TEST(dest,:)=A_TEST(source,:)+A_TEST(dest,:);
A_TEST(:,dest)=A_TEST(:,source)+A_TEST(:,dest);

如果dest是非唯一的,则失败(这是有道理的)。所以我的快速解决方法是在dest

上执行for循环
for (k=1:numel(dest))
    A(dest(k),:)=A(source(k),:)+A(dest(k),:);
    A(:,dest(k))=A(:,source(k))+A(:,dest(k));
end

matlab在这样的循环中很糟糕。如何对此调用进行矢量化?

1 个答案:

答案 0 :(得分:3)

通过以下内容,我将展示如何使用行进行操作。 要用列来做,这是一个类似的方法,但代码不同,我将解释原因。

总而言之,你有一个矩阵A,有n行和p列。 您有[1,n]src范围内的整数列表以及dst的同义词。 我假设它们都具有相同的大小,并且可能包含多于n个元素(因此两者都有重复)。

src s分组为dst s,很明显,您所谈论的操作等同于行的线性重组。这相当于n x n矩阵的预乘,其中元素(i,j) = k表示“对应于目标行的重组i包含具有多重性k的行j”。

以下代码的作用如下:

function A = madScience( A, src, dst )

    n = size(A,1);
    M = eye(n);

    ix = sub2ind( [n,n], dst, src );

    [ux,~,mlt] = unique( ix );
    nux = length(ux);
    mlt = accumarray( mlt(:), 1, [nux,1] );

    M(ux) = M(ux) + mlt';
    A     = M*A;

end

注1:您在帖子中提供的两个代码 NOT 等效;你需要两个独立的for循环才能使它们等效。

注2:对列的相同操作相当于矩阵的后乘法,其中元素(i,j) = k表示“对应于列j的重组包含具有多重性k的列i”

注3:如果A是方形,则可以使用与(M*A) * M'相同的矩阵M执行两个操作(括号很重要)。