我正在获取错误"内部矩阵维度必须达成协议"
的代码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
错误的原因。
您的代码从A
和x
制成一个错误的大小;您需要将代码与您要尝试实现的算法进行比较以确定哪种算法。