王老师您好!
我是一名学生,我在使用您编写的GFK算法matlab代码程序的时候出现了一些问题,我做了一些努力但问题能没有解决,希望能得到您的帮助。
我的程序是在matlab2016b上运行的,我的输入为X_src:400x16的矩阵,Y_src:400x1的列向量,X_tar:400x16的矩阵,Y_tar:400x1的列向量,dim:8;(源域样本和目标域样本的特征维数均为16(16个时域统计特征,未归一化),样本个数均为400)
程序在运行到:G = GFK_core([Ps,null(Ps')], Pt(:,1:dim));这一步报错了。具体错误为:
警告: 此串联操作包含列数不正确的空数组。
在未来的版本中,包含空数组的串联要求所有数组的列数相同。
In MyGFK>GFK_core (line 54)
In MyGFK (line 13)
In main (line 11)
错误使用 *
内部矩阵维度必须一致。
出错 MyGFK>GFK_core (line 53)
G = Q * [V1, zeros(dim,N-dim); zeros(N-dim,dim), V2] ...
出错 MyGFK (line 13)
G = GFK_core([Ps,null(Ps')], Pt(:,1:dim));
出错 main (line 11)
[acc,G] = MyGFK(X_src,Y_src,X_tar,Y_tar,10);
我对GFK_core进行了检查,发现在
G = Q * [V1, zeros(dim,N-dim); zeros(N-dim,dim), V2] ...
- [B1,B2,zeros(dim,N-2dim);B3,B4,zeros(dim,N-2dim);zeros(N-2dim,N)]...
- [V1, zeros(dim,N-dim); zeros(N-dim,dim), V2]' * Q';
这一步中,根据前面的程序得到的矩阵维数确实不一致:
Q为16x16,
[V1, zeros(dim,N-dim); zeros(N-dim,dim), V2]为16x16,
[B1,B2,zeros(dim,N-2dim);B3,B4,zeros(dim,N-2dim);zeros(N-2dim,N)].为20x20,
[V1, zeros(dim,N-dim); zeros(N-dim,dim), V2]' * Q'为16x16
此后,我对Q的值进行了检查,发现在Q=[Ps,null(Ps')]中,Ps为16x16矩阵,而null(Ps')的计算结果为空(16x0的矩阵)!而null函数在matlab中的功能是求解AX=0的解,null(Ps')的计算结果为空(16x0的矩阵)是否说明其无解?
此外,在zeros(dim,N-2dim)中,由于我设置的dim=8,因此,N-2dim<0,zeros(dim,N-2dim)为空矩阵。
由此,在程序
G = Q * [V1, zeros(dim,N-dim); zeros(N-dim,dim), V2] ...
- [B1,B2,zeros(dim,N-2dim);B3,B4,zeros(dim,N-2dim);zeros(N-2dim,N)]...
- [V1, zeros(dim,N-dim); zeros(N-dim,dim), V2]' * Q';
中出现的矩阵维数不匹配的问题是否由Q=[Ps,null(Ps')]以及zeros(dim,N-2*dim)为空?
期待您的帮助,谢谢!