假设我有一个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中,我有我的代
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