最近用到cvx工具箱来求解稀疏问题,大家都知道,cvx工具箱运行起来非常慢,所以想用parfor命令来执行并行运算,提高效率,但是直接在parfor里写cvx_begin会报错
错误使用 cvx_begin (line 41) 可见性违例错误。 请参阅确保 parfor 循环或 spmd 语句中的可见性。
经过查阅资料,发现这样可以解决问题
将
cvx_begin
cvx_end
写为一个单独的function,然后直接在parfor里调用这个子函数即可
例如
function r=Estimate_x(A,y,x,n)
cvx_solver sdpt3
cvx_begin quiet
variable v(n);
minimize (norm(v,1)); % estimate vector x using l_1 minimization
subject to
y-A*v==0;
cvx_end
r=norm(x-v); %compute the error.
end
然后主函数的代码写为:
m=7;
n=10;
k=4;
A=randn(m,n);
x=zeros(n,1);
sp=randn(k,1);
rp=randperm(n);
x(rp(1:k))=sp;
y=A*x; % define your model
parfor k=1:100 %Monte Carlo Simulation for 100 iterations
e(k)=Estimate_x(A,y,x,n);
end
error=mean(e);
参考资料
http://ask.cvxr.com/t/using-cvx-with-gpu-parallel-computing/4862/2