代码拉取完成,页面将自动刷新
@author: slandarer
单位张量生成函数:teye.m
超对角张量生成函数:sdiag.m
使用实例:
% 超对角线为[1,2,3]的超对角张量
A=sdiag([1,2,3],3)
% 3x3x2大小的单位张量
B=teye([3,3,2])
A(:,:,1) =
1 0 0
0 0 0
0 0 0
A(:,:,2) =
0 0 0
0 2 0
0 0 0
A(:,:,3) =
0 0 0
0 0 0
0 0 3
B(:,:,1) =
1 0 0
0 1 0
0 0 1
B(:,:,2) =
0 0 0
0 0 0
0 0 0
张量模-n展开代码:modeN_unfold
使用实例:
X=zeros(3,4,2);
X(1:24)=1:24;
X1=modeN_unfold(X,1)
X2=modeN_unfold(X,2)
X3=modeN_unfold(X,3)
X1 =
1 4 7 10 13 16 19 22
2 5 8 11 14 17 20 23
3 6 9 12 15 18 21 24
X2 =
1 2 3 13 14 15
4 5 6 16 17 18
7 8 9 19 20 21
10 11 12 22 23 24
X3 =
1 2 3 4 5 6 7 8 9 10 11 12
13 14 15 16 17 18 19 20 21 22 23 24
张量模-n展积代码:modeN_prod
使用实例:
X=zeros(3,4,2);
X(1:24)=1:24;
U1=[1,3,5;2,4,6];
U2=[1,0;0,1;1,1];
Y1=modeN_prod(X,U1,1)
Y2=modeN_prod(X,U2,3)
Y1(:,:,1) =
22 49 76 103
28 64 100 136
Y1(:,:,2) =
130 157 184 211
172 208 244 280
Y2(:,:,1) =
1 4 7 10
2 5 8 11
3 6 9 12
Y2(:,:,2) =
13 16 19 22
14 17 20 23
15 18 21 24
Y2(:,:,3) =
14 20 26 32
16 22 28 34
18 24 30 36
超对角线数据抹去张量及正面切片随机旋转张量 实验对象为 DIPUM2E 教材中 256×256 大小的原图(Goldhill 及 peppers),并对 其添加不同扰动后拼接而成 256×256×256 大小的张量,其中 Goldhill 图像将 图像不同位置增添 50×50 大小的亮度为 0 的矩形区域并拼接而成,而 peppers 则是将图像进行不同程度的旋转后拼接成三维张量的形式。
张量CP分解三维代码:CP3_ALS 使用实例:
% 读取数据
file=load('Peppers.mat');
X=file.XData;
% 截断值60,精确度1e-3CP分解
[A,B,C,lambda]=CP3_ALS(X,60,1e-3);
% 使用模-n积还原拟合张量
% sdiag(lambda)x_1A x_2B x_3C
apprX=modeN_prod(modeN_prod(modeN_prod(sdiag(lambda),A,1),B,2),C,3);
% 展示拟合结果
imshow(uint8(apprX(:,:,1)))
% 展示与原图像差值
figure()
imagesc(abs(X(:,:,1)-apprX(:,:,1)))
colormap(PYCM().inferno())% 使用python colormap渲染,可删去
colorbar
不同截断值分解误差:
function demo2_moreT_CP
% 读取数据
file=load('Peppers.mat');
X=file.XData;
for i=60:10:500
% 截断值60,精确度1e-3CP分解
[A,B,C,lambda]=CP3_ALS(X,i,1e-3);
% 使用模-n积还原拟合张量
% sdiag(lambda)x_1A x_2B x_3C
apprX=modeN_prod(modeN_prod(modeN_prod(sdiag(lambda),A,1),B,2),C,3);
diffX=abs(X-apprX);
% 将误差值存入数组
errRMSE(i)=sqrt(sum(diffX.^2,'all')./numel(diffX));
errMEAN(i)=mean(diffX,'all');
errMAX(i)=max(diffX,[],'all');
disp(['the [',num2str(i),']-term fit is completed'])
end
save demo2_CP_err.mat errRMSE errMEAN errMAX
errSet=load('demo2_CP_err.mat');
t=60:10:500;
colororder([82,124,179;170,64,64]./255)
% 双y轴——左侧图
yyaxis left
hold on
plot(t,errSet.errMEAN(t),'o-','Color',[82,124,179]./255,'MarkerFaceColor',[82,124,179]./255,...
'MarkerEdgeColor',[1,1,1],'LineWidth',2,'MarkerSize',12)
plot(t,errSet.errRMSE(t),'^-','Color',[62,85,96]./255,'MarkerFaceColor',[62,85,96]./255,...
'MarkerEdgeColor',[1,1,1],'LineWidth',2,'MarkerSize',12)
ax=gca;
ax.YMinorTick='on';
% 双y轴——右侧图
yyaxis right
plot(t,errSet.errMAX(t),'s-','Color',[170,64,64]./255,'MarkerFaceColor',[170,64,64]./255,...
'MarkerEdgeColor',[1,1,1],'LineWidth',2,'MarkerSize',12)
% 图例
legend('MEAN error','RMSE error','MAX error')
% 坐标区域修饰
ax=gca;grid on;box off
ax.LineWidth=1.5;
ax.GridLineStyle='-.';
ax.GridColor=[1,1,1].*.2;
ax.Color=[249,250,245]./255;
ax.XMinorTick='on';
ax.YMinorTick='on';
ax.FontName='Cambria';
ax.FontSize=13;
end
张量HO-SVD N维代码:HO-SVD 使用实例:
% 读取数据
file=load('Peppers.mat');
X=file.XData;
% 截断值60,HO-SVD分解
[G,U]=HO_SVD(X,60);
% 使用模-n积还原拟合张量
% Gx_1U_1 x_2U_2 x_3U_3
apprX=modeN_prod(modeN_prod(modeN_prod(G,U{1},1),U{2},2),U{3},3);
% 展示拟合结果
imshow(uint8(apprX(:,:,1)))
% 展示与原图像差值
figure()
imagesc(abs(X(:,:,1)-apprX(:,:,1)))
colormap(PYCM().inferno())% 使用python colormap渲染,可删去
colorbar
不同截断值分解误差:
function demo2_moreT_HOSVD
% 读取数据
file=load('Peppers.mat');
X=file.XData;
for i=60:10:250
% 截断值i,HO-SVD分解
[G,U]=HO_SVD(X,i);
% 使用模-n积还原拟合张量
% Gx_1U_1 x_2U_2 x_3U_3
apprX=modeN_prod(modeN_prod(modeN_prod(G,U{1},1),U{2},2),U{3},3);
diffX=abs(X-apprX);
% 将误差值存入数组
errRMSE(i)=sqrt(sum(diffX.^2,'all')./numel(diffX));
errMEAN(i)=mean(diffX,'all');
errMAX(i)=max(diffX,[],'all');
disp(['the [',num2str(i),']-term fit is completed'])
end
save demo2_HOSVD_err.mat errRMSE errMEAN errMAX
errSet=load('demo2_HOSVD_err.mat');
t=60:10:250;
colororder([82,124,179;170,64,64]./255)
% 双y轴——左侧图
yyaxis left
hold on
plot(t,errSet.errMEAN(t),'o-','Color',[82,124,179]./255,'MarkerFaceColor',[82,124,179]./255,...
'MarkerEdgeColor',[1,1,1],'LineWidth',2,'MarkerSize',12)
plot(t,errSet.errRMSE(t),'^-','Color',[62,85,96]./255,'MarkerFaceColor',[62,85,96]./255,...
'MarkerEdgeColor',[1,1,1],'LineWidth',2,'MarkerSize',12)
ax=gca;
ax.YMinorTick='on';
% 双y轴——右侧图
yyaxis right
plot(t,errSet.errMAX(t),'s-','Color',[170,64,64]./255,'MarkerFaceColor',[170,64,64]./255,...
'MarkerEdgeColor',[1,1,1],'LineWidth',2,'MarkerSize',12)
% 图例
legend('MEAN error','RMSE error','MAX error')
% 坐标区域修饰
ax=gca;grid on;box off
ax.LineWidth=1.5;
ax.GridLineStyle='-.';
ax.GridColor=[1,1,1].*.2;
ax.Color=[249,250,245]./255;
ax.XMinorTick='on';
ax.YMinorTick='on';
ax.FontName='Cambria';
ax.FontSize=13;
end
张量O-SVD 代码:O-SVD 使用实例:
% 读取数据
file=load('Peppers.mat');
X=file.XData;
% 截断值60,O-SVD分解
[U,S,V,F]=O_SVD(X,60);
% 使用模-n积及切片积还原拟合张量
% U *_3S *_3V x_3F
apprX=modeN_prod(slice_prod(slice_prod(U,S,3),V,3),F,3);
% 展示拟合结果
imshow(uint8(apprX(:,:,1)))
% 展示与原图像差值
figure()
imagesc(abs(X(:,:,1)-apprX(:,:,1)))
colormap(PYCM().inferno())% 使用python colormap渲染,可删去
colorbar
不同截断值分解误差:
function demo2_moreT_OSVD
% 读取数据
file=load('Peppers.mat');
X=file.XData;
for i=60:10:250
% 截断值i,O-SVD分解
[U,S,V,F]=O_SVD(X,i);
% 使用模-n积及切片积还原拟合张量
% U *_3S *_3V x_3F
apprX=modeN_prod(slice_prod(slice_prod(U,S,3),V,3),F,3);
diffX=abs(X-apprX);
% 将误差值存入数组
errRMSE(i)=sqrt(sum(diffX.^2,'all')./numel(diffX));
errMEAN(i)=mean(diffX,'all');
errMAX(i)=max(diffX,[],'all');
disp(['the [',num2str(i),']-term fit is completed'])
end
save demo2_OSVD_err.mat errRMSE errMEAN errMAX
errSet=load('demo2_OSVD_err.mat');
t=60:10:250;
colororder([82,124,179;170,64,64]./255)
% 双y轴——左侧图
yyaxis left
hold on
plot(t,errSet.errMEAN(t),'o-','Color',[82,124,179]./255,'MarkerFaceColor',[82,124,179]./255,...
'MarkerEdgeColor',[1,1,1],'LineWidth',2,'MarkerSize',12)
plot(t,errSet.errRMSE(t),'^-','Color',[62,85,96]./255,'MarkerFaceColor',[62,85,96]./255,...
'MarkerEdgeColor',[1,1,1],'LineWidth',2,'MarkerSize',12)
ax=gca;
ax.YMinorTick='on';
% 双y轴——右侧图
yyaxis right
plot(t,errSet.errMAX(t),'s-','Color',[170,64,64]./255,'MarkerFaceColor',[170,64,64]./255,...
'MarkerEdgeColor',[1,1,1],'LineWidth',2,'MarkerSize',12)
% 图例
legend('MEAN error','RMSE error','MAX error')
% 坐标区域修饰
ax=gca;grid on;box off
ax.LineWidth=1.5;
ax.GridLineStyle='-.';
ax.GridColor=[1,1,1].*.2;
ax.Color=[249,250,245]./255;
ax.XMinorTick='on';
ax.YMinorTick='on';
ax.FontName='Cambria';
ax.FontSize=13;
end
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。