我在下面的代码中得到错误“内部矩阵尺寸必须达成一致”
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;
。我试图将*
更改为逐点产品.*
,但后来我得到错误“内部矩阵尺寸必须同意”。
x
应该是矢量输入,当乘以矩阵A
时将很好地定义,但是这个函数句柄会导致一些问题
你必须考虑你想要最大限度地减少T
。您提供的初始条件x0
(在您的情况下zeros(1,N_alpha)
应该可用于代替x
,当您的函数是T
。它们不是,因为x
应该是100元素列向量,而不是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
documentation
你的功能
@(x) 1/2*norm(A*x-y_delta)^2+(alphas/2)*norm(x)^2
尝试将矩阵A
乘以其输入参数x
。但是你的代码将A
设置为100 x 100矩阵,而对fminsearch
的调用告诉它函数的初始输入应该是1 x 3向量。这就是为什么你正确得到Inner matrix dimensions must agree
错误。
你的代码是用A
和x
制作一个错误的大小;你需要比较代码正在做什么与你试图实现的算法,以确定哪些。