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