生活随笔
收集整理的這篇文章主要介紹了
常见测量矩阵的MATLAB实现
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
常見測(cè)量矩陣的MATLAB實(shí)現(xiàn)
? ? ? ??下面以文獻(xiàn)【吳赟.壓縮感知測(cè)量矩陣的研究[D]. 西安電子科技大學(xué)碩士學(xué)位論文,2012】為依據(jù),給出文獻(xiàn)中2.2節(jié)內(nèi)容所述的六種測(cè)量矩陣MATLAB實(shí)現(xiàn)代碼,僅為一種參考實(shí)現(xiàn)方式,還未驗(yàn)證其正確性。
1、高斯矩陣
? ? ? ??以下代碼生成的高斯矩陣方差為1,若為改為1/M,只須將除以根號(hào)M即可。
[plain]?view plaincopy
function?[?Phi?]?=?GaussMtx(?M,N?)?? %GaussMtx?Summary?of?this?function?goes?here?? %???Generate?Bernoulli?matrix??? %???M?--?RowNumber?? %???N?--?ColumnNumber?? %???Phi?--?The?Gauss?matrix?? ?? %%?Generate?Gauss?matrix????? ????Phi?=?randn(M,N);?? ????%Phi?=?Phi/sqrt(M);?? end??
2、伯努利矩陣
? ? ? ??以下代碼是按式(2-8)生成的伯努利矩陣,若要按式(2-9)生成則需使用后半部分注釋掉的代碼即可。注意代碼中用到了MATLAB自帶的randi函數(shù),若你的MATLAB版本較低,可能要用randint函數(shù)代替,后面若用到此函數(shù)則一樣要注意這一點(diǎn)。
[plain]?view plaincopy
function?[?Phi?]?=?BernoulliMtx(?M,N?)?? %BernoulliMtx?Summary?of?this?function?goes?here?? %???Generate?Bernoulli?matrix??? %???M?--?RowNumber?? %???N?--?ColumnNumber?? %???Phi?--?The?Bernoulli?matrix?? ?? %%?(1)Generate?Bernoulli?matrix(The?first?kind)?? %?1--P=0.5???-1--P=0.5?? ????Phi?=?randi([0,1],M,N);%If?your?MATLAB?version?is?too?low,please?use?randint?instead?? ????Phi(Phi==0)?=?-1;?? ????%Phi?=?Phi/sqrt(M);?? %?%%?(2)Generate?Bernoulli?matrix(The?second?kind)?? %?%?1--P=1/6???-1--P=1/6??0--2/3?? %?????Phi?=?randi([-1,4],M,N);%If?your?MATLAB?version?is?too?low,please?use?randint?instead?? %?????Phi(Phi==2)?=?0;%P=1/6?? %?????Phi(Phi==3)?=?0;%P=1/6?? %?????Phi(Phi==4)?=?0;%P=1/6?? %?????%Phi?=?Phi*sqrt(3/M);?? end??
3、部分哈達(dá)瑪矩陣
? ? ? ??由于MATLAB自帶的函數(shù)hadamard參數(shù)有限制,所以程序中首先計(jì)算滿足要求的參數(shù)L,需要注意的是,hadamard參數(shù)并不像文獻(xiàn)中所述僅為2的整數(shù)次冪,而是12的整數(shù)倍或20的整數(shù)倍或2的整數(shù)次冪,詳情在MATLAB查看hadamard的help文件。
[plain]?view plaincopy
function?[?Phi?]?=?PartHadamardMtx(?M,N?)?? %PartHadamardMtx?Summary?of?this?function?goes?here?? %???Generate?part?Hadamard?matrix??? %???M?--?RowNumber?? %???N?--?ColumnNumber?? %???Phi?--?The?part?Hadamard?matrix?? ?? %%?parameter?initialization?? %Because?the?MATLAB?function?hadamard?handles?only?the?cases?where?n,?n/12,?? %or?n/20?is?a?power?of?2?? ????L_t?=?max(M,N);%Maybe?L_t?does?not?meet?requirement?of?function?hadamard?? ????L_t1?=?(12?-?mod(L_t,12))?+?L_t;?? ????L_t2?=?(20?-?mod(L_t,20))?+?L_t;??? ????L_t3?=?2^ceil(log2(L_t));?? ????L?=?min([L_t1,L_t2,L_t3]);%Get?the?minimum?L?? %%?Generate?part?Hadamard?matrix????? ????Phi?=?[];?? ????Phi_t?=?hadamard(L);?? ????RowIndex?=?randperm(L);?? ????Phi_t_r?=?Phi_t(RowIndex(1:M),:);?? ????ColIndex?=?randperm(L);?? ????Phi?=?Phi_t_r(:,ColIndex(1:N));?? end??
4、部分傅里葉矩陣
? ? ? ??以下代碼生成的是部分傅里葉矩陣,這里要提的一點(diǎn)是,有關(guān)“歸一化”的概念在網(wǎng)上說(shuō)法不一,一種說(shuō)法是向量除以向量各項(xiàng)之和,另一種說(shuō)法是向量除以向量的2范數(shù)(各項(xiàng)平方之和再開方),這里采用后者。
[plain]?view plaincopy
function?[?Phi?]?=?PartFourierMtx(?M,N?)?? %PartFourierMtx?Summary?of?this?function?goes?here?? %???Generate?part?Fourier?matrix??? %???M?--?RowNumber?? %???N?--?ColumnNumber?? %???Phi?--?The?part?Fourier?matrix?? ?? %% Generate?part?Fourier?matrix????? ????Phi_t?=?fft(eye(N,N))/sqrt(N);%Fourier?matrix?? ????RowIndex?=?randperm(N);?? ????Phi?=?Phi_t(RowIndex(1:M),:);%Select?M?rows?randomly?? ????%normalization?? ????for?ii?=?1:N?? ????????Phi(:,ii)?=?Phi(:,ii)/norm(Phi(:,ii));?? ????end?? end??
5、稀疏隨機(jī)矩陣
[plain]?view plaincopy
function?[?Phi?]?=?SparseRandomMtx(?M,N,d?)?? %SparseRandomMtx?Summary?of?this?function?goes?here?? %???Generate?SparseRandom?matrix??? %???M?--?RowNumber?? %???N?--?ColumnNumber?? %???d?--?The?number?of?'1'?in?every?column,d<M??? %???Phi?--?The?SparseRandom?matrix?? ?? %%?Generate?SparseRandom?matrix????? ????Phi?=?zeros(M,N);?? ????for?ii?=?1:N?? ????????ColIdx?=?randperm(M);?? ????????Phi(ColIdx(1:d),ii)?=?1;?? ????end?? end??
6、托普利茲矩陣和循環(huán)矩陣
? ? ? ??這里先給出托普利茲矩陣,文中說(shuō)經(jīng)過(guò)M次循環(huán),這里直接利用MATLAB自帶函數(shù)生成一個(gè)托普利茲方陣再取前M行。
[plain]?view plaincopy
function?[?Phi?]?=?ToeplitzMtx(?M,N?)?? %ToeplitzMtx?Summary?of?this?function?goes?here?? %???Generate?Toeplitz?matrix??? %???M?--?RowNumber?? %???N?--?ColumnNumber?? %???Phi?--?The?Toeplitz?matrix?? ?? %%?Generate?a?random?vector?? %?????%(1)Gauss?? %?????u?=?randn(1,2*N-1);?? ????%(2)Bernoulli?? ????u?=?randi([0,1],1,2*N-1);?? ????u(u==0)?=?-1;?? %%?Generate?Toeplitz?matrix????? ????Phi_t?=?toeplitz(u(N:end),fliplr(u(1:N)));?? ????Phi?=?Phi_t(1:M,:);?? end??
? ? ? ??下面是循環(huán)矩陣,仍然利用MATLAB自帶函數(shù)生成。
[plain]?view plaincopy
function?[?Phi?]?=?CirculantMtx(?M,N?)?? %CirculantMtx?Summary?of?this?function?goes?here?? %???Generate?Circulant?matrix??? %???M?--?RowNumber?? %???N?--?ColumnNumber?? %???Phi?--?The?Circulant?matrix?? ?? %%?Generate?a?random?vector?? %?????%(1)Gauss?? %?????u?=?randn(1,N);?? ????%(2)Bernoulli?? ????u?=?randi([0,1],1,N);?? ????u(u==0)?=?-1;?? %%?Generate?Circulant?matrix????? ????Phi_t?=?toeplitz(circshift(u,[1,1]),fliplr(u(1:N)));?? ????Phi?=?Phi_t(1:M,:);?? end??
? ? ? ??以上都是采用MATLAB自帶的toeplitz函數(shù),這需要首先生成一個(gè)隨機(jī)向量,而托普利茲矩陣和循環(huán)矩陣的區(qū)別也就在于這個(gè)隨機(jī)向量的結(jié)構(gòu)不同,注意代碼中有關(guān)toeplitz函數(shù)的兩個(gè)輸入?yún)?shù)好好體會(huì)即可。
總結(jié)
以上是生活随笔為你收集整理的常见测量矩阵的MATLAB实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。