(一) 软件使用
1、恢复默认窗口布局
主页—布局—默认
2、快捷键
(1)将光标快速移动到代码最上端
Ctrl + Home
(2)将光标快速移动到代码最底部
Ctrl + End
(二)常用代码
1、常用语句
1、开头必备代码
clear all % 清除工作区缓存数据
clc
rng(2) % 固定随机值
2、Hybrid mmWave信道建模常用参数,导频,噪声的生成
注:(1)(2)(3)(4)例程出自IEEE的论文“ 论文网址Channel Estimation for Reconfigurable Intelligent Surface Aided Multi-User mmWave MIMO Systems”
(1) 复路径增益服从高斯分布
alpha_l = sqrt(0.5)*(normrnd(0,1,1,1) + 1j*normrnd(0,1,1,1));%均值为0,方差为1,维度是1*1
(2) 信道噪声设计
U=sqrt(0.5)*(normrnd(0,1,N,M) + 1j*normrnd(0,1,N,M));%均值为0,方差为1,维度是N*M
(3) 关于SNR的使用
我们的目的是从接收信号中恢复信道矩阵,所以必须先消掉发射信号导频s,这篇文章PT设置的是10dBw。
(4) 生成正交导频序列
Userpilot=dftmtx(System.K); % The pilot sequence of all users,文中设置时隙个数等于用户数量
(5) 产生服从单位圆的预编码和解码矩阵
例程论文链接为例程论文
论文对应代码为论文对应github代码
Q=exp(1j*2*pi*rand(M1,N1))/sqrt(N1); %M1是解码向量的个数每一行的norm(Q(1,:),'fro') = 1
P=exp(1j*2*pi*rand(M2,N2))/sqrt(N2);
(6) 生成服从单位圆的预编码和解码矩阵
F=exp(1j*2*pi*rand(Ns,M))/sqrt(M);
E=exp(1j*2*pi*rand(Ns,P))/sqrt(P);
3、保存和调用变量
(1) 保存变量
Q_sample是定义的矩阵,Q是给它取的名字
clear all
clc
N1 = 128; %基站天线数量
M1 = 128; %RIS元件数量
save M M1
save N N1
(2)调用变量
变量名字和保存的时候一样
load M M1
M = M1;
load N N1
N = N1;
2、常用函数
1、dBm和dBw换算成w的函数
function dBm_W = dBm_W(dbm,Pt)
dBm_W = 10^(dbm/10)/1000; % dbm换算成w的单位
end
function dBw_W = dBw_W(dbw)
dBw_W = 10^(dbw/10); % dbw换算成w的单位
end
2、khatri_rao积函数
function kr=khatri_rao(F,G)
nR_F=size(F,1); %F的行数
nR_G=size(G,1); %G的行数
mul=ones(nR_G,1);
FF=kron(F,mul); %通过kron函数实现对F矩阵的扩充,得到FF矩阵
GG=repmat(G,nR_F,1);%通过repmat函数实现对G矩阵的扩充,得到GG矩阵
kr=FF.*GG;
end
3、大尺度衰落系数函数
function alpha_ss = large_scale(d_br,path_loss_br)
% 路径增益 大尺度衰落
% d_br BS-RIS的距离
% path_loss_bu = 3; % BS-User 路径损耗指数,正数
% pathloss_ref = 30; % 单位是dB,,,,, 正数,,,,, the pathloss at the distance of 1 meter,
alpha_ss = 10^(-pathloss_ref/10)*d_br^(-path_loss); % BS-RIS 路径增益
end
3、steer vector导航向量函数
function u_sv = steer_vector(theta,N)
% theta的取值范围是[-pi/2,-pi/2]
% 导航向量的维度是 N*1 的列向量
for j = 1:N
u_sv(j,1) = exp(-1i*pi*(j-1)*sin(theta)); %BS-RIS接收端得导航向量,列向量
end
end
3、画图
1、基本的画图代码
clear all
clc
f2=figure(2); %给每一幅图命名,不命名的话如果运行多幅图就共用一个窗口,会覆盖,命名之后产生新的窗口
plot(t,t-1,'-o','linewidth',1)%1
hold on;
plot(t,SNR11_db,'g','linewidth',1)%2
hold on;
plot(t,SNR_ran11_db,'--b','linewidth',1)%3
hold on;
plot(t,SNR_with1,'-.^r','linewidth',1)%4
hold on;
plot(t,SNR_with2,'-.vc','linewidth',1)%5
hold on;
plot(t,t,'s:k')%6
grid on;
xlabel('Number of transmitting antennas','FontSize',14, 'FontName', 'Times New Roman'); %横坐轴标签,可以调整大小
ylabel('Receive Sum_Rate (dB)','FontSize',14, 'FontName', 'Times New Roman'); %纵坐轴标签
legend('L-RES','ITER-DIS','LS'); %根据plot的先后顺序,命名每一条线
hold off;
(1) plot 的颜色以及线型 (顺序是线形,颜色,标记类型)
(2) plot 的标记类型定义符
2、自定义的RGB画图代码
注:色卡网址色卡
(1) 一个X轴对应一个Y轴
clear all
clc
f9 = figure(9); % 命名窗口
LW = 1.5; % 线的粗细
MS = 6; % 图线上符号的大小
FS = 12; % x轴y轴符号的大小(是标在刻度上的符号)
% 示例数据
x = [40,50,60,70,80]; % x轴数据
y_left_1 = [1,2,3,4,5]; % 以左边y轴为y轴的第1条线
y_left_2 = [5,4,3,2,1]; % 以左边y轴为y轴的第2条线
y_left_3 = [5,6,7,8,9]; % 以左边y轴为y轴的第3条线
% 左边坐标轴画图
plot(x,y_left_1,'s-.','color',rgb('light blue'),'LineWidth',LW,'MarkerSize',MS)
hold on;
plot(x,y_left_3,'o--','color',rgb('lightish blue'),'LineWidth',LW,'MarkerSize',MS)
hold on;
plot(x,y_left_2,'x:','color',rgb('blue'),'LineWidth',LW,'MarkerSize',MS,'MarkerFaceColor',rgb('baby blue'))
ylabel('Sum-Rate bits/s/Hz','FontSize',14, 'FontName', 'Times New Roman'); % 左侧纵坐标标签
ylim([0, 10]); % 设置左侧纵坐标范围
% 添加通用的横坐标标签和标题
xlabel('title of x','FontSize',14, 'FontName', 'Times New Roman'); % 横坐轴标签,可以调整大小,字号,字体
legend('Y_left_1','Y_left_2', 'Y_left_3', 'Location', 'best'); % 添加图例
set(gca,'linewidth',1.5); % 网格线的粗细
grid on; % 添加网格
ax = gca; % 获取当前坐标轴
% ax.XColor = 'black'; % 设置x轴颜色,不设置的话根据画出线的颜色自动设定
% ax.YColor = 'black'; % 设置y轴颜色,不设置的话根据画出线的颜色自动设定
ax.GridColor = 'black'; % 设置网格线的颜色
(2) 两个Y轴共用一个X轴
clear all
clc
f8 = figure(8); % 命名窗口
LW = 1.5; % 线的粗细
MS = 6; % 图线上符号的大小
FS = 12; % x轴y轴符号的大小(是标在刻度上的符号)
% 示例数据
x = [40,50,60,70,80]; % x轴数据
y_left_1 = [1,2,3,4,5]; % 以左边y轴为y轴的第1条线
y_left_2 = [5,4,3,2,1]; % 以左边y轴为y轴的第2条线
y_left_3 = [5,6,7,8,9]; % 以左边y轴为y轴的第3条线
y_right_1 = [3,4,5,6,7]; % 以右边y轴为y轴的第1条线
y_right_2 = [5,5.6,6,7,8]; % 以右边y轴为y轴的第2条线
y_right_3 = [7,8,9,10,11]; % 以右边y轴为y轴的第3条线
% 左边坐标轴画图
yyaxis left
plot(x,y_left_1,'s-.','color',rgb('light blue'),'LineWidth',LW,'MarkerSize',MS)
hold on;
plot(x,y_left_3,'o--','color',rgb('lightish blue'),'LineWidth',LW,'MarkerSize',MS)
hold on;
plot(x,y_left_2,'x:','color',rgb('blue'),'LineWidth',LW,'MarkerSize',MS,'MarkerFaceColor',rgb('baby blue'))
ylabel('Sum-Rate bits/s/Hz','FontSize',14, 'FontName', 'Times New Roman'); % 左侧纵坐标标签
ylim([0, 10]); % 设置左侧纵坐标范围
% 右边的能效图
yyaxis right
plot(x,y_right_1,'s-.','color',rgb('light red'),'LineWidth',LW,'MarkerSize',MS)
hold on;
plot(x,y_right_3,'o--','color',rgb('pale red'),'LineWidth',LW,'MarkerSize',MS)
hold on;
plot(x,y_right_2,'x:','color',rgb('red'),'LineWidth',LW,'MarkerSize',MS,'MarkerFaceColor',rgb('baby blue'))
ylabel('Energy Efficiency (EE)','FontSize',14, 'FontName', 'Times New Roman'); % 右侧纵坐标标签
ylim([1, 11]); % 设置右侧纵坐标范围
% 添加通用的横坐标标签和标题
xlabel('title of x','FontSize',14, 'FontName', 'Times New Roman'); % 横坐轴标签,可以调整大小,字号,字体
legend('Y_left_1','Y_left_2', 'Y_left_3','Y_right_1','Y_right_1', 'Y_right_1', 'Location', 'best'); % 添加图例
set(gca,'linewidth',1.5); % 网格线的粗细
grid on; % 添加网格
ax = gca; % 获取当前坐标轴
% ax.XColor = 'black'; % 设置x轴颜色,不设置的话根据画出线的颜色自动设定
% ax.YColor = 'black'; % 设置y轴颜色,不设置的话根据画出线的颜色自动设定
ax.GridColor = 'black'; % 设置网格线的颜色
(三)基本运算符号和函数
1、基本数学符号
(1) 对数 log2(16);
(2为底数也可以换成10,或者需要的数字)
(2) 根号 sqrt(9);
(3) 除法 1/2=0.5
1\2=2
(4) 取余 mod(10,3)
(10除3的余数)
(5) 平方 a^2
(a)的平方
2、复数运算和取值
(1) 取复数实部和虚部 S = real(z);
C = imag(z);
(2) 求复数的角度
` b_1 = angle(b);` (b为弧度)
`b_2 = angle(b)*180/pi; ` (b为角度)
3、一些特殊值
(1) π pi
(2) 取光速
c1 = physconst('lightspeed');
4、常用函数
(1) e 指数函数 exp()
(括号存放e的指数)
``exp(1i*2*pi)`` (不要用exp(1*i*2*pi),如果一旦加乘号,那么程序里面一旦有已经赋值的i,计算的时候会直接把i的值代入。)
5、基本关系符
(1) 不等于 ~=
(四)矩阵及其运算
1、特殊矩阵
(1) 零矩阵 A=zeros(m,n);
(2) 全1矩阵 A=ones(m,n);
(3) 产生m*n矩阵,这个矩阵的元素都是处于imin和imax之间的整数
p = randi([imin,imax],[m n]);
(4) 返回一个主对角线元素为 1 且其他位置元素为 0 的 n×m 矩阵,即单位阵 I = eye(n,m)
(5) 对角矩阵,关于diag的使用
d = [1,0,0;0,5,0;0,0,9];
d1 = diag(d); %%d1 =[1;5;9] d1是列向量
d2 = diag(d1); %%d2 = [1,0,0;0,5,0;0,0,9]
2、矩阵基本数学运算
(1) 转置 A = B.’
(2) 共轭转置 A = B’
(3) 按元素相除 ./
(4) 按元素相乘: .*
(5) 共轭 conj(A)
(6) 数组求和
` S = sum(A,"all") ` 数组所有元素求和
` sum(A,2) ` 返回包含每一行总和的列向量。
(7) Kronecker product
K = kron(A,B);
2、矩阵基本操作,行列式
(1) 从矩阵取某几行某几列元素
`a(1:2,3);` 获取矩阵第三列第一行和第二行的元素
`a([1 3],3) ;` 获取矩阵第三列第一行和第三行的元素
`a(2:end,3) ;` 获取矩阵第三列第一行和第三行的元素
`a= A(:,[1 3]) ;` 取矩阵的第一列和第三列
(2) 从0到10,每隔2数取一个值
` A = [0:2:10];`
(3) 求一维矩阵长度
A = [1, 2, 3, 4, 5];
len = length(A); % 返回数组A的长度,即5
(4) 对矩阵元素进行升序或者降序排序
` [c index] = sort(A,'descend'); ` 降序 `[c index] = sort(A,'ascend');` 升序
(5) 返回矩阵的元素最大值 M = max(A)
如果 A 是向量,则 max(A) 返回 A 的最大值。
如果 A 为矩阵,则 max(A) 是包含每一列的最大值的行向量。
(6) 矩阵元素的排列组合
从1-5里面选3个数的所有可能组合,每个组合数字不重复 nchoosek([1:5],3);
向量内所有元素可能得排列方式 a1 = perms(a);
(7) 重复拼接矩阵
3、行列式运算
(1) 生成特征值和特征向量 [V D] = eig(A);
D是由特征值组成的对角阵,V的每一列是A的一个特征向量
(2) 对矩阵A求逆 Y = inv(A);
(3) 矩阵的迹 trace(A)
主对角线元素之和
(4) 矩阵的逆矩阵 inv(A)
A必须是方阵
4、关于矩阵范数
(1) 矩阵列范数 norm(a,1)
% (每列的所有元素绝对值之和的最大值)
(2) 矩阵行范数 norm(a,inf);
% (每行的所有元素绝对值之和的最大值)
(3) 矩阵的二范数也叫矩阵的欧几里得范数(A的转置乘以A矩阵的结果的特征根最大值的开根号)
b = norm(a);
b1 = norm(a,2);
(4) 矩阵的Frobenius范数 norm(a,'fro');
% (矩阵元素绝对值平方的和的平方根)
5、关于张量分解的仿真
(1)、自己写的函数和tensor工具中自带的函数结果是一样的
clc;
clear;
A = [3+2i,2+1i,-2+2i,1+5i; 1+2i,3+1i,-3+2i,2+5i; 3+5i,1+3i,1+2i,-4+1i];
B = [1+2i,2+2i,-1+5i,-2+5i; 1+2i,-2+3i,1+2i,2+3i;];
C = [2+1i,3+2i,-2+3i,-2+6i; -1+2i,-1+3i,3+2i,-2+3i;];
alpha = [2+6i; 1 + 3i; -9+5i; 2+1i];
ceshi = khatri_rao(khatri_rao(A,B),C); %在函数章节自己写的函数
ceshi1 = khatrirao(A,B,C); %tensor工具自带的函数
ceshi - ceshi1
(2)、A ⊕ \oplus ⊕B ≠ \ne = B ⊕ \oplus ⊕A
clc;
clear;
A = [3+2i,2+1i,-2+2i,1+5i; 1+2i,3+1i,-3+2i,2+5i; 3+5i,1+3i,1+2i,-4+1i];
B = [1+2i,2+2i,-1+5i,-2+5i; 1+2i,-2+3i,1+2i,2+3i;];
ceshi1 = khatrirao(A,B); %tensor工具自带的函数
ceshi2 = khatrirao(B,A); %tensor工具自带的函数
ceshi1 - ceshi2
(3)、A ⊕ \oplus ⊕B就等于A和B的第一列的kron积
ceshi1 = khatrirao(A,B); %tensor工具自带的函数
ceshi2 = kron(A(:,1),B(:,1)); %tensor工具自带的函数
ceshi1(:,1) - ceshi2
(4)、关于ktensor(alpha,A,B,C)的用法
注释:alpha是每列的权重,必须放在第一个,ABC的列数相同
clc; clear;
alpha = [2+6i; 1+3i; -9+5i; 2+1i];
A = [3+2i, 2+1i, -2+2i, 1+5i;
1+2i, 3+1i, -3+2i, 2+5i;
3+5i, 1+3i, 1+2i, -4+1i];
B = [1+2i, 2+2i, -1+5i, -2+5i;
1+2i, -2+3i, 1+2i, 2+3i;];
C = [2+1i, 3+2i, -2+3i, -2+6i;
-1+2i, -1+3i, 3+2i, -2+3i;];
ceshi1_tem = ktensor(alpha,A,B,C); %tensor工具自带的函数
(5)tensor的用法
clc; clear;
alpha = [2+6i; 1+3i; -9+5i; 2+1i];
A = [3+2i, 2+1i, -2+2i, 1+5i;
1+2i, 3+1i, -3+2i, 2+5i;
3+5i, 1+3i, 1+2i, -4+1i];
B = [1+2i, 2+2i, -1+5i, -2+5i;
1+2i, -2+3i, 1+2i, 2+3i;];
C = [2+1i, 3+2i, -2+3i, -2+6i;
-1+2i, -1+3i, 3+2i, -2+3i;];
ceshi1_tem = ktensor(alpha,A,B,C);
ceshi1=tensor(ceshi1_tem);