使用函数句柄时,Matlab“矩阵维度必须一致”

问题描述 投票:0回答:2

我在下面的代码中得到错误“内部矩阵尺寸必须达成一致”

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时将很好地定义,但是这个函数句柄会导致一些问题

matlab debugging matrix
2个回答
1
投票

你必须考虑你想要最大限度地减少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


0
投票

你的功能

@(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错误。

你的代码是用Ax制作一个错误的大小;你需要比较代码正在做什么与你试图实现的算法,以确定哪些。

© www.soinside.com 2019 - 2024. All rights reserved.