当前位置 : 主页 > 网络安全 > 测试自动化 >

性能 – 使用矩阵结构加速matlab

来源:互联网 收集:自由互联 发布时间:2021-06-22
假设我有一个N-by-K矩阵A,N-by-P​​矩阵B.我想进行以下计算以得到我的最终N-by-P​​矩阵X. X(n,p) = B(n,p) - dot(gamma(p,:),A(n,:)) 哪里 gamma(p,k) = dot(A(:,k),B(:,p))/sum( A(:,k).^2 ) 在MATLAB中,我有我的代
假设我有一个N-by-K矩阵A,N-by-P​​矩阵B.我想进行以下计算以得到我的最终N-by-P​​矩阵X.

X(n,p) = B(n,p) - dot(gamma(p,:),A(n,:))

哪里

gamma(p,k) = dot(A(:,k),B(:,p))/sum( A(:,k).^2 )

在MATLAB中,我有我的代码

for p = 1:P
    for n = 1:N
        for k = 1:K
            gamma(p,k) = dot(A(:,k),B(:,p))/sum(A(:,k).^2);
        end
        x(n,p) = B(n,p) - dot(gamma(p,:),A(n,:));
    end
end

这是非常低效的,因为它使用三个for循环!有没有一种加速这段代码的好方法?

使用bsxfun进行循环的除法和矩阵乘法:

gamma = bsxfun(@rdivide, B.'*A, sum(A.^2));
x = B - A*gamma.';

这是一个测试脚本

N = 3;
K = 4;
P = 5;

A = rand(N, K);
B = rand(N, P);

for p = 1:P
    for n = 1:N
        for k = 1:K
            gamma(p,k) = dot(A(:,k),B(:,p))/sum(A(:,k).^2);
        end
        x(n,p) = B(n,p) - dot(gamma(p,:),A(n,:));
    end
end

gamma2 = bsxfun(@rdivide, B.'*A, sum(A.^2));
X2 = B - A*gamma2.';

isequal(x, X2)
isequal(gamma, gamma2)

返回

ans =
     1
ans =
     1
网友评论