我有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 ...
...
但我无法弄清楚如何做到这一点(没有循环)。也许这里有一种完全不同的方法?
我将a
和b
值存储在向量中。
答案 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
<强>解释强>
鉴于a
和b
,我们希望将每个元素的每两个元素合并为一个矩阵。第一步是我们将沿着第二维连接a
和b
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