【问题标题】:Matlab "matrix dimensions must agree" when using function handleMatlab使用函数句柄时“矩阵尺寸必须一致”
【发布时间】:2017-12-20 12:32:45
【问题描述】:

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

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


    【解决方案1】:

    您必须考虑您试图最小化T 的内容。您提供的初始条件x0(在您的情况下,zeros(1,N_alpha) 应该可以在您的函数为T 时代替x。它们不是,因为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

    【讨论】:

      【解决方案2】:

      你的功能

      @(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 中的一个大小错误;您需要将代码正在执行的操作与您尝试实现的算法进行比较以确定哪个。

      【讨论】:

      • 问题是设置N_alpha=100会产生同样的错误
      • 所以现在您尝试将 100 x 100 矩阵乘以 1 x 100 行向量,但仍然无法正常工作。如果您将A*x 更改为A*x'(即将x 转置为列向量),那么您的代码就会运行。不过,您必须弄清楚这是否是实现算法的正确解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-12
      • 2011-12-05
      相关资源
      最近更新 更多