2

マトリックスを自動的にセットアップするスクリプトを作成する必要がありますA。この行列のサイズは、ワークスペース内の別の変数 の値にリンクされていますN。一般に、A にはN + N*(N-1)/2行とN列があります。

最初のN行とN列は基本的に単なる対角行列であり、 を使用して簡単に設定できますdiag

マトリックスの下部の設定に問題があります。基本的には、次の形式にする必要があります。

-1  0  0  0
 0 -1  0  0
 0  0 -1  0
 0  0  0 -1
 1 -1  0  0
 1  0 -1  0
 1  0  0 -1
 0  1 -1  0
 0  1  0 -1
 0  0  1 -1

パターンがはっきりしていると思います。

Matlab が の任意の値に対してこの行列を設定するように、これをコーディングするにはどうすればよいNですか?

ありがとう

4

3 に答える 3

1

アップデート

事前割り当てを含むパフォーマンス バージョン。

N=4;
result = zeros(N*(N+1)/2,N+1);
t = N;
endpos = 0;
for t = N:-1:1 
    result(endpos+1:endpos+t,:) = [zeros(t, N-t) ones(t,1) -eye(t)];
    endpos = endpos + t;
end
result = result(:,2:end);

whileを好むように見えるので、ループを置き換えたことに注意してくださいfor


比較のためにオリジナルもここに残しておきます。

どうぞ:

result = [];
N = 4;
t = MaxN;
while t > 0
    block = [zeros(t, N-t) ones(t,1) -eye(t)];
    result = [result; block];
    t = t-1;
end
result = result(:,2:end);
于 2013-09-12T07:50:22.297 に答える
0

みんなありがとう!ここに独自のソリューションを投稿します(ただし、事前割り当てはしません)。@Dennisのソリューションに合わせて調整するかもしれません。

N = max(size(a));
P = N*(N-1)/2;

A = zeros(N+P,N);

A(1:N,1:N) = diag(-a);

B=[];

for i = N-1:-1:1
    Block = [zeros(i,N-1-i) ones(i,1) -eye(i)];
    B = [B; Block];
    clear Block
end

A(N+1:end,:) = B;
clear N P B i
于 2013-09-12T09:43:01.227 に答える