如何设置具有固定模式的矩阵

时间:2013-09-12 07:45:10

标签: matlab matrix

我需要编写一个脚本来自动设置矩阵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的任何值设置此矩阵?

由于

3 个答案:

答案 0 :(得分:3)

用一些代数操作:

L=(N*(N+1)/2):-1:1;
R=ceil((sqrt(8*L+1)-1)/2);
A=bsxfun(@eq, N-1:-1:0, R')-bsxfun(@eq, N:-1:1, (L-(R.*(R-1))/2).');

答案 1 :(得分: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);

答案 2 :(得分: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