2016-12-10 6 views
0

の変数を持つN系の線形方程式があります。ループを使わずにすべてを解決する必要があります。私は、そう私がやろうとしているが、それは対角線に沿ってN個のブロックで構成されるようにA行列を構築することで、MATLAB /オクターブでの方程式のシステムを解決するために、あなたはループを使用せずにN系統の方程式を解く

x = A \ y; 

を行うことができますことを知っています

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

しかし、私はちょうど(ループなしで)これを行う方法を見つけることができません。おそらく、ここでは全く異なるアプローチがありますか?

abの値がベクターに格納されています。

+2

を生み出す{:}インデックスを使用してblkdiagに別々の入力引数として、これらの細胞の配列の要素を渡すことができますが、もっと重要なのは、なぜあなたの 'A'マトリックスに' b'を入れようとしているのですか?あなたが同時に解決しようとしている方程式の[mcve]を提供するかもしれません。 – Suever

+0

@Sueverああ、 'x = A \ b'のbは、マトリックスのものと同じではありません。混乱して申し訳ありません(私の質問を編集しました)。私は 'blkdiag'があることを知っていますが、ループなしでそれを使う方法はわかりません。どうやら' [a(i)、a(i + 1); b(i)、b(i + 1)] ... ... – Dunno

答えて

1

Aマトリックスを作成するには、blkdiagを使用します。対角線に沿って配置する各項目を構成するには、連結(cat)とmat2cellを組み合わせて使用​​し、{:}インデックスを付けて各セル配列要素を別の値としてblkdiagに渡すことができます。

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た説明

は、我々はそれぞれのすべての2つの要素を取り、マトリックスにそれらを結合したいです。最初のステップは、私たちは、今、最初の2つの行が1つのマトリックスの一部であるような2×2の行列にこれを破るにしたいしたい、我々は第二の次元に沿って

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

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

abを連結しようとしているということです次の2つは、別の行列の一部であり、そのようなものです。 mat2cellを使用すると、この行列をセル配列に変換できます。ここで、各要素には、上で説明したように2 x 2行列が含まれています。

repmat(2, [numel(a)/2, 1])は、単純に合計がa内の要素の合計数(答えに、私は一般的なsz変数と2つのを交換した)に等しい私たちはすべて2の配列をしたいと言っています。これは、各セル要素に入れる行数を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 
+0

ありがとう、それは私が探していたものです。あなたはもう少し詳しく説明できますか? – Dunno

+0

@Dunno私は何が起こっているの詳細な説明を更新しました – Suever

関連する問題