You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实现核最小均方(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)直接相加。

核心修改点

  1. 权重初始化:KLMS的权重对应每个输入样本的系数,需初始化为与样本数一致的维度(1, samples);
  2. 估计输出计算:调整矩阵乘法的维度,确保w与核向量维度匹配;
  3. 权重更新:将核向量转置后再与误差、步长相乘,保证和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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 08:43:13