在不使用循环的情况下求解N个方程组

时间:2016-12-10 15:02:49

标签: matlab octave

我有N个线性方程组,每个都有k个变量。我必须解决所有这些但不使用循环。我知道为了解决matlab / octave中的方程组,你可以做到

x = A \ y;

所以我要做的是构建A矩阵,使其沿对角线包含N个块,如下所示:

a1 b1 0  0  ...
a2 b2 0  0  ...
0  0  a3 b3 ...
0  0  a4 b4 ...
0  0  0  0  ...
     ...

但我无法弄清楚如何做到这一点(没有循环)。也许这里有一种完全不同的方法?

我将ab值存储在向量中。

1 个答案:

答案 0 :(得分:1)

您可以使用A创建blkdiag矩阵。要构建沿对角线放置的每个项目,您可以使用连接(cat)与mat2cell结合,然后使用{:}索引将每个单元数组元素传递给blkdiag as一个单独的价值。

a = [1 2 3 4];
b = [5 6 7 8];

% The size of each "block"
sz = 2;

inputs = mat2cell(cat(2, a(:), b(:)), repmat(sz, [numel(a)/sz, 1]));

%   [2x2 double]
%   [2x2 double]

A = blkdiag(inputs{:});

%   1     5     0     0
%   2     6     0     0
%   0     0     3     7
%   0     0     4     8

<强>解释

鉴于ab,我们希望将每个元素的每两个元素合并为一个矩阵。第一步是我们将沿着第二维连接ab

C = cat(2, a(:), b(:))

%    1     5
%    2     6
%    3     7
%    4     8

我们现在想要将其分解为2 x 2矩阵,使得前两行是一个矩阵的一部分,接下来的两行是另一个矩阵的一部分,因此。我们可以使用mat2cell将此矩阵转换为单元数组,其中每个元素包含一个2 x 2矩阵,如上所述。

repmat(2, [numel(a) / 2, 1])只是说我们想要一个包含所有2的数组,其总和等于a中的元素总数(在我已经替换2&#39的答案中) ; s带有通用sz变量)。这指示mat2cell要在每个单元格元素中放置多少行。

D = mat2cell(C, repmat(2, [numel(a) / 2, 1]))

%   D{1} =
%
%     1     5
%     2     6
%
%   D{2} =
%
%     3     7
%     4     8

然后,我们可以使用blkdiag索引将这些单元格数组元素作为单独的输入参数传递给{:},从而产生comma-separated list

blkdiag(D{:})

%   1     5     0     0
%   2     6     0     0
%   0     0     3     7
%   0     0     4     8