原子范数 Atomic norm最小化: 简单的Matlab例程

这篇具有很好参考价值的文章主要介绍了原子范数 Atomic norm最小化: 简单的Matlab例程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

基于 压缩感知的尽头: 原子范数最小化 中的原子范数最小化算法, 笔者做了一些matlab的仿真, 作为简单的例程,希望帮助大家进一步理解算法和自定义的拓展。

由于凸问题的求解需要使用 CVX, 因此需要读者先自行安装好 matlab 的 CVX包。

1-D 无噪场景

假设接收天线有 64 64 64根, 有 3 3 3个单天线的目标源同时发射信号, 接收信号可以表示为:
z = [ a ( f 1 ) , a ( f 2 ) , a ( f 3 ) ] [ s 1    s 2    s 3 ] T = A ( f ) s z=[a(f_1), a(f_2), a(f_3)][s_1\; s_2\; s_3]^T=A(f)s z=[a(f1),a(f2),a(f3)][s1s2s3]T=A(f)s
其中, a ( f ) = [ 1 , e i 2 π f , … , e i 2 π ( M − 1 ) f ] T \boldsymbol{a}(f)=\left[1, e^{i 2 \pi f}, \ldots, e^{i 2 \pi(M-1) f}\right]^{T} a(f)=[1,ei2πf,,ei2π(M1)f]T 代表天线响应矢量。 这里假设没有噪声。 那么 从 z z z 中估计 f f f, 我们使用原子范数最小化算法。 代码如下:

N = 64;  % number of antennas
f = [0.1, 0.4, 0.3];  % f = cos(theta)
A = exp(1j * 2 * pi * (0 : N-1)' * f);  % A = [a(f1), ..., a(fK)]
s = ones(3, 1);  % 3 sources
z = A * s;


cvx_begin sdp 
cvx_solver sdpt3
variable T(N, N) hermitian toeplitz
variable x 
minimize(0.5 * x + 0.5 * T(1,1))
[ x z'; z T] >= 0;
cvx_end

[Phi,P] = rootmusic(T, 3, 'corr');
Phi / 2 / pi 

中间 cvx_begin 和 cvx_end 包围的部分, 我们就是在求解 和 原子范数最小化等价的 SDP问题。 CVX可以返回解得的 T。 最后, 我们使用 rootmusic函数, 可以将 T T T 对应的 f f f 得到, 即为 Phi。 (本来是做范德蒙德分解,然后得到, 但通过rootmusic提取出 f f f 更加便捷。)

输出结果如下:

>> ANM_1D
 
Calling SDPT3 4.0: 4225 variables, 128 equality constraints
   For improved efficiency, SDPT3 is solving the dual problem.
------------------------------------------------------------

 num. of constraints = 128
 dim. of sdp    var  = 130,   num. of sdp  blk  =  1
*******************************************************************
   SDPT3: Infeasible path-following algorithms
*******************************************************************
 version  predcorr  gam  expon  scale_data
   HKM      1      0.000   1        0    
it pstep dstep pinfeas dinfeas  gap      prim-obj      dual-obj    cputime
-------------------------------------------------------------------
 0|0.000|0.000|4.3e+03|1.1e+01|2.2e+05| 0.000000e+00  0.000000e+00| 0:0:00| chol  1  1 
 1|0.893|1.000|4.6e+02|2.3e-01|2.9e+04|-5.933532e+00 -3.889838e+01| 0:0:00| chol  1  1 
 2|0.988|1.000|5.4e+00|2.3e-02|3.8e+02|-2.814220e+00 -3.796329e+01| 0:0:00| chol  1  1 
 3|0.943|1.000|3.1e-01|2.3e-03|3.3e+01|-3.966408e+00 -1.985735e+01| 0:0:00| chol  1  1 
 4|0.888|0.790|3.5e-02|6.6e-04|1.3e+01|-2.602549e+00 -1.421772e+01| 0:0:00| chol  1  1 
 5|1.000|1.000|1.2e-09|7.0e-03|2.8e+00|-2.914921e+00 -5.690264e+00| 0:0:00| chol  1  1 
 6|0.980|0.987|1.4e-10|9.2e-05|3.6e-02|-2.998482e+00 -3.034630e+00| 0:0:00| chol  1  1 
 7|0.979|0.987|4.9e-11|1.4e-06|5.0e-04|-2.999973e+00 -3.000466e+00| 0:0:00| chol  1  1 
 8|0.978|0.986|9.6e-11|2.1e-08|7.3e-06|-2.999999e+00 -3.000007e+00| 0:0:00| chol  1  1 
 9|0.976|0.990|2.1e-10|2.2e-10|2.1e-07|-3.000000e+00 -3.000000e+00| 0:0:00| chol  1  1 
10|0.950|0.988|1.3e-11|2.5e-11|9.0e-09|-3.000000e+00 -3.000000e+00| 0:0:01|
  stop: max(relative gap, infeasibilities) < 1.49e-08
-------------------------------------------------------------------
 number of iterations   = 10
 primal objective value = -3.00000000e+00
 dual   objective value = -3.00000001e+00
 gap := trace(XZ)       = 8.95e-09
 relative gap           = 1.28e-09
 actual relative gap    = 1.31e-09
 rel. primal infeas (scaled problem)   = 1.26e-11
 rel. dual     "        "       "      = 2.48e-11
 rel. primal infeas (unscaled problem) = 0.00e+00
 rel. dual     "        "       "      = 0.00e+00
 norm(X), norm(y), norm(Z) = 7.4e-01, 1.4e+01, 8.0e+01
 norm(A), norm(b), norm(C) = 6.5e+01, 1.7e+00, 1.5e+01
 Total CPU time (secs)  = 0.50  
 CPU time per iteration = 0.05  
 termination code       =  0
 DIMACS: 1.4e-11  0.0e+00  1.5e-10  0.0e+00  1.3e-09  1.3e-09
-------------------------------------------------------------------
 
------------------------------------------------------------
Status: Solved
Optimal value (cvx_optval): +3
 

ans =

    0.4000
    0.1000
    0.3000

中间是CVX的求解过程。 可以通过在 cvx_begin 后面 输入 quiet参数使其不输出。 最后的结果就是根据原子范数最小化求得的 f f f 的值, 可以看到。 分毫不差。

z= A * s替换为 z = A * s + 0.5 * (randn(N, 1) + 1j * randn(N, 1));, 可以人为的加入噪声,当噪声大小增大时, 可以看到估计结果会出现一些误差。

s=ones(3,1)可以替换为 s=randn(3,1)之类的,加入随机性。

2-D 无噪声场景

能看到这里, 说明已经对原子范数有了一定的了解。 那这里就不再多废话, 直接上代码:文章来源地址https://www.toymoban.com/news/detail-403972.html

N = 64;  % number of antennas
L = 5;
f = [0.1, 0.4, 0.3];  % f = cos(theta)
A = exp(1j * 2 * pi * (0 : N-1)' * f);  % A = [a(f1), ..., a(fK)]
S = randn(3, L) + 1j * randn(3, L);  % 3 sources
Z = A * s ;


cvx_begin sdp quiet
cvx_solver sdpt3
variable T(N, N) hermitian toeplitz
variable X(L, L) hermitian 

minimize(trace(X) + trace(T))
[X Z'; Z T] >= 0;
cvx_end

[Phi,P] = rootmusic(T, 3, 'corr');
Phi / 2 / pi 


2-D 有噪声场景

N = 64;  % number of antennas
L = 5;
sigma = 0.5; 
f = [0.1, 0.4, 0.3];  % f = cos(theta)
A = exp(1j * 2 * pi * (0 : N-1)' * f);  % A = [a(f1), ..., a(fK)]
S = randn(3, L) + 1j * randn(3, L);  % 3 sources
Y = A * s + sigma * (randn(N, 1) + 1j * randn(N, 1));
lambda = sqrt(N * (L + log(N) + sqrt( 2 * L * log(N)))*sigma);

cvx_begin sdp quiet
cvx_solver sdpt3
variable T(N, N) hermitian toeplitz
variable X(L, L) hermitian 
variable Z(N, L) complex

minimize(lambda * (trace(X) + trace(T)) + 0.5*sum_square_abs(vec(Y - Z)))
[X Z'; Z T] >= 0;
cvx_end

[Phi,P] = rootmusic(T, 3, 'corr');
Phi / 2 / pi 

到了这里,关于原子范数 Atomic norm最小化: 简单的Matlab例程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • LeetCode——最小化字符串长度

    目录 一、题目 二、题目解读  三、代码  1、set去重 2、用一个二进制数记录每个字母是否出现过 6462. 最小化字符串长度 - 力扣(Leetcode) 给你一个下标从  0  开始的字符串  s  ,重复执行下述操作  任意  次: 在字符串中选出一个下标  i  ,并使  c  为字符串下标  i

    2024年02月08日
    浏览(62)
  • QT最小化程序到托盘运行

    实现程序关闭时最小化托盘的功能 托盘实现显示主页面和退出的功能 支持扩展,直接引用TrayIcon类即可,对外暴露接口 单例实现,可复用 注:博主所有资源永久免费,若有帮助,请点赞转发是对我莫大的帮助 注:博主本人学习过程的分享,引用他人的文章皆会标注原作者

    2024年02月05日
    浏览(51)
  • Qt实现最小化窗口到托盘图标

    目录 前言: 1.先看效果图 2.大致思路以及实现流程 3.具体代码以及解释 4.总结 使用QT开发桌面软件,将软件最小化至托盘这样的功能的是比较常见的,今天自己实现一下这个功能,并进行记录总结。  主要功能就是当软件开始运行, 在系统托盘会自动出现一个关于本软件的

    2023年04月08日
    浏览(48)
  • LabVIEW开发最小化5G系统测试平台

    LabVIEW开发最小化5G系统测试平台 由于具有大量存储能力和数据的应用程序的智能手机的激增,当前一代产品被迫提高其吞吐效率。正交频分复用由于其卓越的品质,如单抽头均衡和具有成本效益的实施,现在被广泛用作物理层技术。这些好处是以严格的同步、正交性和高功耗

    2024年02月12日
    浏览(41)
  • unity发布设置(最小化、置顶、限制单开)

    1. 勾上下图标红处,发布后可防止按windows键缩小  2.发布后程序默认最小化 3.发布的程序只能开一个进程

    2024年02月12日
    浏览(42)
  • 最小化安装Linux系统初始化脚本

    目录 最小化安装Linux系统初始化脚本 注:此脚本适用于centos 7/8、Ubuntu1804,具体需要根据实际情况进行测试调整。 此脚本包含的功能: 允许 root 用户使用 ssh 登录 关闭 selinux 关闭防火墙 设置 ps1 设置默认编辑器为 vim 自定义 vim 自定义历史命令 修改内核参数 设置资源限制 修

    2024年02月12日
    浏览(44)
  • leetcode 2616. 最小化数对的最大差值

    在数组nums中找到p个数对,使差值绝对值的和最小。 思路: 最小差值应该是数值相近的一对数之间产生,让数值相近的数字尽量靠在一起方便计算,所以需要排序。 这里不去直接考虑一对对的数字,而是直接考虑差值的取值。 用binary search搜索一个差值。 左边界是0,右边界

    2024年02月13日
    浏览(38)
  • 【深度优先搜索】【图论】【树】2646. 最小化旅行的价格总和

    【数位dp】【动态规划】【状态压缩】【推荐】1012. 至少有 1 位重复的数字 深度优先搜索 图论 树 现有一棵无向、无根的树,树中有 n 个节点,按从 0 到 n - 1 编号。给你一个整数 n 和一个长度为 n - 1 的二维整数数组 edges ,其中 edges[i] = [ai, bi] 表示树中节点 ai 和 bi 之间存在

    2024年02月19日
    浏览(40)
  • mac 最小化全部程序回到桌面(基于alfred workflow)

    换到 mac 系统之后,很多快捷键根本就不好用,组合太多了,除了 cmd + Q/W/A/S/X/R/Z/C/V ,个人认为其它的真的一坨屎。像我的需求就是,开的窗口太多了,我需要全部最小化,再重新打开我需要那个窗口。而 Windows 上的 win + D 就是很符合我的需求,于是我研究一下 mac 怎么实现

    2024年04月17日
    浏览(45)
  • 如何给最小化安装的CentOS主机装个远程桌面?

    正文共:888 字 18 图,预估阅读时间:1 分钟 前面我们领微软云Azure的免费主机时 ( 白嫖党618福利!来Azure领200美刀!外加云主机免费用一年! ) ,发现“有资格免费试用服务”的主机实例类型只有B1s,规格为1核vCPU、1 GB内存。我也尝试了安装Windows10的操作系统,但是开机后

    2024年02月19日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包