关于 cvx & spams 的两个版本的安装、测试

spams 稀疏估计优化工具箱

在64位 win下需要编译,

使用 spams-matlab-v2.6-2017-02-27.tar.gz 时,
参考下面的博客进行的安装。
- http://blog.csdn.net/heyamore/article/details/45482755 SPAMS稀疏建模工具箱

win8.1+vs2015+matlab2016b

在MATLAB中配置:mex -setup C++编译器

修改 compile.m 文件的相关内容如下:
compiler=’mex’; %’gcc’;
use_multithread=false; % true;

在MATLAB中执行 compile 。其中,下面几个文件不能编译:
% ‘-I./linalg/ -I./prox/ prox/mex/mexGraphOfGroupStruct.cpp’,
% ‘-I./linalg/ -I./prox/ prox/mex/mexGroupStructOfString.cpp’,
% ‘-I./linalg/ -I./prox/ prox/mex/mexReadGroupStruct.cpp’,
% ‘-I./linalg/ -I./prox/ prox/mex/mexSimpleGroupTree.cpp’,
% ‘-I./linalg/ -I./prox/ prox/mex/mexTreeOfGroupStruct.cpp’

修改C++文件,有可能修复,基本上是类型不兼容。但没做。


使用 spams-matlab-v2.5-svn2014-07-04.tar.gz 时,
修改 compile.m 文件的相关内容如下:
compiler=’mex’; %’gcc’;
use_multithread=false; % true;

在MATLAB中执行 compile 。这个版本编译后,没有出错。

CVX:matlab中的凸优化工具箱 ##

使用的是:cvx-w64-30beta,内有例子目录。win8.1+matlab2016b,安装过程:
进入目录:E:\Wang_Lab\MATLAB\MATLAB_SOFTWARE\cvx-w64-30beta\cvx ,执行 cvx_setup ,显示有:


2 solvers require a CVX Professional license:
Gurobi {cvx}\gurobi\w64
Mosek unknown {cvx}\mosek\w64


To change the default solver, type “cvx_solver ”.
To save this change for future sessions, type “cvx_save_prefs”.
Please consult the users’ guide for more information.


WARNING: An existing copy of “square.m” was found in your MATLAB path:
C:\Program Files\MATLAB\R2016b\toolbox\signal\signal\square.m
Models using SQUARE() in CVX expressions will not be affected; but outside
of CVX, this version will be used, and it likely has a different meaning.
To avoid any confusion, just use X.^2 instead of SQUARE(X) in CVX.


测试主页上给的例子,成功。

学术版key获取,邮件放在QQ邮箱里了。先放在路径 E:\MATLAB\MATLAB_SOFTWARE\cvx-w64-30beta\cvx 下,执行 cvx_setup ,然后,拷贝到存档位置。

仍然有一个不能用:

3 solvers initialized (* = default):
Mosek 8.0.0.60 {cvx}\mosek\w64
* SDPT3 4.0 {cvx}\sdpt3
SeDuMi 1.34 {cvx}\sedumi
3 solvers not found:
ECOS https://github.com/ifa-ethz/ecos
GLPK http://glpkmex.sourceforge.net/
SCS https://github.com/cvxgrp/scs
1 solver skipped due to other errors:
Gurobi {cvx}\gurobi\w64
No valid Gurobi license was found. (Please note that this
license is not the same as the CVX license; it must be
obtained directly from Gurobi Optimization.) If you do have
a Gurobi license, the the Gurobi MEX file could not find it.
Please consult the Gurobi documentation for assistance.


关于 cvx & spams 的两个版本的测试

用下文内容进行测试:( 来自:http://blog.csdn.net/xiahouzuoxin/article/details/38820925 )

clc
clear all
close all

%% 产生原始信号及相关参数
n = 512; % 信号长度
s = 25; % 稀疏度(从下面知道,分时域和频域的情况)
m = 5*s; % 测量长度 M>=S*log(N/S)
freq_sparse = 0; % 信号频域稀疏则为1

if freq_sparse
t = [0: n-1]’;
f = cos(2*pi/256*t) + sin(2*pi/128*t); % 产生频域稀疏的信号
else
tmp = randperm(n);
f = zeros(n,1);
f(tmp(1:s)) = randn(s,1); % 产生时域稀疏的信号
end

%% 产生感知矩阵和稀疏表示矩阵
Phi = sqrt(1/m) * randn(m,n); % 感知矩阵(测量矩阵)
% A = get_A_fourier(n, m);

y = Phi * f; % 通过感知矩阵获得测量值
% Psi 将信号变换到稀疏域
if freq_sparse % 信号频域可以稀疏表示
Psi = inv(fft(eye(n,n))); % 傅里叶正变换,频域稀疏正交基(稀疏表示矩阵)
else % 信号时域可以稀疏表示
Psi = eye(n, n); % 时域稀疏正交基
end
A = Phi * Psi; % 恢复矩阵 A = Phi * Psi

%% 下面两个方法要分别执行,其中spams要测试两个版本的。

%% 优化方法1:使用CVX工具进行凸优化
addpath(‘../../cvx-w64/cvx/’);
cvx_startup; % 设置cvx环境
cvx_begin
variable xp(n); % complex; % 如果xp是复数,则添加complex,否则不加
minimize (norm(xp, 1));
subject to
A * xp == y;
cvx_end

%% 优化方法2:使用spams工具箱进行优化
addpath(‘spams-matlab/build’);
param.L = 100;
param.eps = 0.001;
param.numThreads = -1;

A=A./repmat(sqrt(sum(A.^2)),[size(A,1) 1]);
xp = mexOMP(y, A, param); % 正交匹配追踪法Orthogonal Matching Pursuit

%% 对比原信号和
if freq_sparse
xp = real(ifft(full(xp))); % 傅里叶逆变换
else

end
figure;
plot(f);
hold on
plot(real(xp), ‘r.’);
legend(‘Original’, ‘Recovered’);


cvx的计算结果貌似比spams的更准确。

猜你喜欢

转载自blog.csdn.net/jueshu/article/details/77182373