我在MATLAB中有一个单位矩阵,该矩阵用于联合假设检验的某些回归分析中。但是,当我更改测试的线性限制时,我将不再依赖于恒等矩阵。
举一个简单的例子,下面的代码根据y
的值生成一个单位矩阵:
for i = [1, 2, 4]
y = i
x = 5;
H = eye(y*x)
end
但是,我需要的不是身份矩阵,而是前两行,所有其他行都为零。
对于第一个示例,代码产生一个eye(5)
:
H =
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1
我需要给定y
不能产生身份但实际上产生的东西:
H =
1 0 0 0 0
0 1 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
我是否可以将单位矩阵调整为仅在前两行之后包含零?
答案 0 :(得分:4)
我认为最简单的解决方案是建立一个全零的矩阵,然后将两个全零放置在linear indexing处:
H = zeros(x*y);
H([1 x*y+2]) = 1;
概括以上内容,将第一个N
放在对角线上:
H = zeros(x*y);
H(x*y.*(0:(N-1))+(1:N)) = 1;
答案 1 :(得分:3)
根据this comment中的建议,您可以使用diag
:
diag([ones(2,1); zeros(x*y-2,1)])
之所以可行,是因为diag
使向量成为方阵的主要对角线,因此您可以简单地将对角线向量作为对角线向量,即您的情况是2 1s,其余0s。
当然,如果您需要可变的1s,对此我对此表示怀疑,
n=2;
diag([ones(n,1); zeros(x*y-n,1)])
答案 2 :(得分:2)
以下是一些替代方案:
使用blkdiag
对角连接一个单位矩阵和一个零矩阵:
y = 5; x = 2;
H = blkdiag(eye(x), zeros(y-x));
更奇特的方法是对singleton expansion使用按元素进行比较,并利用two NaN
's are not equal to each other的事实:
y = 5; x = 2;
H = [1:x NaN(1,y-x)];
H = double(bsxfun(@eq, H, H.'))