实现核最小均方(KLMS)时遇矩阵维度不匹配错误求助
核最小均方(KLMS)代码维度匹配问题修复
报错原因分析
运行时出现Inner matrix dimensions must agree是因为权重向量w的维度与核矩阵k的维度不匹配:
- 原代码中
w初始化为(1, Sensors)(1×10),但核矩阵k是(samples, samples)(1000×1000),计算y(1,n) = w*k(:,n)'时,1×10的向量和1×1000的向量无法完成矩阵乘法; - 权重更新步骤
w1 = w + mu*e(n)*k(:,n)同样存在维度不兼容问题,1×10的w无法和1000×1的k(:,n)直接相加。
核心修改点
- 权重初始化:KLMS的权重对应每个输入样本的系数,需初始化为与样本数一致的维度
(1, samples); - 估计输出计算:调整矩阵乘法的维度,确保
w与核向量维度匹配; - 权重更新:将核向量转置后再与误差、步长相乘,保证和
w维度一致。
修正后的完整代码
Sensors = 10; % 接收端数量 samples = 1000; % 信号集数量 p = 10; % 信号数量 angles = [10 20 40 60 100 120 140 80 90 110]*(pi/180); X = zeros(Sensors,samples); for k=1:p-1 % 循环生成信号 Array_factor = exp(j*pi*cos(angles(1,k))*(0:Sensors-1 )); % 阵列因子 br =ones(1,samples); % 生成实部基础向量 temp = rand(1,samples); % 生成随机数 br(find(temp<.5))=-1; % 调整实部取值 bi =ones(1,samples); % 生成虚部基础向量 temp = rand(1,samples); % 生成随机数 bi(find(temp<.5))=-1; % 调整虚部取值 b = br+j*bi; % 构造复信号 X = X +Array_factor'*b; % 合成输入信号 end % 期望信号生成 A = exp(j*pi*cos(angles(1,p))*(0:Sensors-1)); % 设置期望信号参考阵列因子 dr =ones(1,samples); % 生成实部基础向量 temp = rand(1,samples); % 生成随机数 dr(find(temp<.5))=-1; % 调整实部取值 di =ones(1,samples); % 生成虚部基础向量 temp = rand(1,samples); % 生成随机数 di(find(temp<.5))=-1; % 调整虚部取值 d = dr+j*di; % 构造复期望信号 X = X +A'*d; % 合成最终输入信号 X = awgn(X,13); % 添加信噪比13dB的高斯白噪声 mu = 0.002; % 步长 sse=0; % 误差平方和 % 修正:权重初始化为1×samples的零向量,对应每个样本的核系数 w=zeros(1,samples); % 核函数定义 sigma = 0.1; % 核参数,可根据问题调整 kernel_function = @(x,y)exp(-norm(x-y)^2/(2*sigma^2)); % 预计算核矩阵 k = zeros(samples, samples); for i = 1:samples for j=1:samples k(i,j) = kernel_function(X(:,i),X(:,j)); end end % KLMS实现 for n = 1:samples % 修正:用w与核矩阵的第n列(前n个元素)做乘法,维度匹配 y(1,n) = w(1:n) * k(1:n,n); % 仅用前n个样本的核系数计算估计输出 e(n) = d(n) - y(1,n); % 计算误差 % 修正:将核向量转置为行向量,确保和w维度一致后再更新 w(1:n) = w(1:n) + mu*e(n)*k(1:n,n)'; se(n) = (abs(e(n)))^2; % 误差平方 sse = sse + se(n); % 累计误差平方和 LMSE(n) = 20*log10((sse/n)); % 对数均方误差 end
额外说明
- 原代码中预计算了完整的核矩阵,实际KLMS通常不需要预计算全部核矩阵,而是每步计算当前样本与历史样本的核值,这样可以节省内存;
- 修正后的代码中,每步仅更新前n个权重(对应前n个输入样本),符合KLMS的递推逻辑,避免无效的权重计算。
内容的提问来源于stack exchange,提问作者owais ishtiaq
相关产品推荐
相关产品推荐

