如果我理解您的问题表述,不幸的是,您在那里设置的方法不是解决问题的正确方法。该假设假设您试图将所有点放在一条线上。因此,B 的每一行都将作为您试图找到其线性回归的 one 线上的一个点。如果您想同时求解多行,则需要更改公式。
这其实很简单。我将假设您有 30 个(x,y) 点,其中每个点表示一条线的一个方程。您将它们分别设置为Xs 和Ys。每个等式的输出也在Zs 中。我还将假设这些是 column 向量,因此,您的系统设置如下:
a_i 和 b_i 是每行的系数。您知道每一行的(x,y),您的目标是解决每个对应的a 和b。因此,您需要重新设计您的系统,以便解决a 和b。
以矩阵形式重写该问题,可以这样完成:
a_1, b_1, a_2, b_2, ... 的右侧向量是您最终要解决的问题。你可以看到我们有一个Y = M*X 的矩阵方程,其中M 和Y 是已知的,X 是我们需要通过执行X = M\Y 来解决的问题。因此,您只需将x 和y 值重新排列成一个像上面这样的块矩阵。首先,我们需要找到正确的线性索引,以便我们可以将 x 和 y 值放入该矩阵中,然后使用 ldivide 运算符通过最小二乘法求解系统。该矩阵是一个N x 2N 矩阵,其中N 是我们拥有的方程或约束的总数(因此在您的情况下为30):
N = numel(Xs);
M = zeros(N, 2*N);
xind = sub2ind(size(M), 1:N, 1:2:2*N);
yind = sub2ind(size(M), 1:N, 2:2:2*N);
M(xind) = Xs;
M(yind) = Ys;
sub2ind 允许您使用一行代码将多个值放入矩阵中。具体来说,sub2ind 从一组行和列坐标中确定 linear 索引以访问矩阵。如果您还不知道,您可以使用单个数字而不是一对行和列来访问矩阵中的值(和设置值)。 sub2ind 将允许您通过指定一组线性索引来一次在矩阵中设置多个值,以使用相应的向量访问矩阵。
在我们的例子中,我们需要两组线性索引——一组用于x 值,一组用于y 值。请注意,x 值从第一列开始,每隔一列跳过。对于y 值,可以说相同的行为,但我们从第二列开始。一旦我们有了这些索引,我们就在这个矩阵中设置x 和y 值,现在我们只需求解系数:
coeff = M \ Z;
coeff 现在将是 2N x 1 向量,因此如果您愿意,可以将其重新整形为矩阵:
coeff = reshape(coeff, 2, []);
现在,coeff 的形状将使得每个 列 都会为您拥有的每个方程提供一对 a,b。因此,第一列表示a_1, b_1,第二列表示a_2, b_2,依此类推。 coeff 的第一行是每个约束的所有 a 系数,而第二行是每个约束的所有 b 系数。