使用函数句柄时的 Matlab "matrix dimensions must agree"



我正在获取错误"内部矩阵维度必须达成协议"

的代码
t = linspace(0,10,100);
x_exact = exp(-(t-4).^2); % exact solution
x_exact = x_exact';
lambda = randn(size(x_exact)); % diagonal values
A = diag(lambda); % diagonal matrix
y = A*x_exact; % exact data
delta = 1e-3*randn(size(y)); % noise
y_delta = y+delta; % noisy data
%% Define functional
% preallocate the memory
N_alpha = 3;
alpha = zeros(1,N_alpha);
resulting_x = cell(1,N_alpha);
alpha(1) = 1e-9;
alpha(N_alpha) = 1;
x = zeros(100,1);
for n = 1:N_alpha
    alpha(n) = alpha(1)+(n-1)*((alpha(N_alpha)-alpha(1))/(N_alpha-1));
    alphas = alpha(n);
    T = @(x) 1/2*norm(A*x-y_delta)^2+(alphas/2)*norm(x)^2; 
    resulting_x{n} = fminsearch(@(x) T(x),zeros(1,N_alpha));
end

专门在线路T = @(x) 1/2*norm(A*x-y_delta)^2+(alphas/2)*norm(x)^2;上。我试图将*更改为Pointsise产品.*,但随后我遇到了"内矩阵维度必须同意"。

x应该是向量输入,当乘以矩阵A时,它将被很好地定义,但是此函数句柄引起了一些问题

您必须考虑您试图将T最小化。您提供的初始条件x0(在您的情况下,zeros(1,N_alpha)应在您的功能为T时代替x。它们不是,因为x应该是100 element列向量,而不是3个元素行向量!

使用此功能将有效:

resulting_x{n} = fminsearch(@(x) T(x),zeros(100,1));

,但似乎您对x是什么感到困惑,因为您不需要将其定义在循环之上。也许你打算做

x0 = zeros(100,1);
for n = 1:N_alpha
    alpha(n) = alpha(1)+(n-1)*((alpha(N_alpha)-alpha(1))/(N_alpha-1));
    alphas = alpha(n);
    T = @(x) 1/2*norm(A*x-y_delta)^2+(alphas/2)*norm(x)^2; 
    resulting_x{n} = fminsearch(@(x) T(x), x0);
end

有关更多信息,请参见fminsearch文档

您的功能

@(x) 1/2*norm(A*x-y_delta)^2+(alphas/2)*norm(x)^2

尝试通过其输入参数x将矩阵A乘以。但是您的代码将A设置为100 x 100矩阵,而拨打fminsearch的调用告诉它,该函数的初始输入应为1 x 3向量。这就是为什么您正确获得Inner matrix dimensions must agree错误的原因。

您的代码从Ax制成一个错误的大小;您需要将代码与您要尝试实现的算法进行比较以确定哪种算法。

最新更新