MATLAB에서 특정 순위로 mxn 행렬을 만드는 방법은 무엇입니까?
Dec 22 2020
m by n
순위가 있는 행렬 을 만들고 싶습니다 k
.
Like A
is 8 × 8
with rank 5
또는 B
is 4 × 6
with rank 4
.
그래서 아래와 같이 MATLAB에서 함수를 작성하려고합니다.
내 생각은 :
- 발생
m
하여n
제로 행렬 - 행렬로 생성
m
하고n
이를 축약 된 행 사다리꼴로 변환합니다. - 2의 행렬의 순위를 num에 할당
- 이면
num = k
현재 행렬을 출력에 할당합니다. - 반복을 끊다
function output = check_rank(m,n,k)
while 1
output = zeros(m,n);
matrix = randi(20,m,n);
tmp = rref(matrix);
num = rank(tmp);
if (num == k)
output = matrix;
break;
end
disp(output);
end
A = check_rank(8,8,4)
결과는 무한 루프이고 모든 답은 6x6
0 행렬입니다. 명령 창 출력
matlab을 사용하여 순위 k 행렬을 만드는 방법도 시도해 보았습니다 .
A = zeros(8,8);
for i = 1:4, A = A + randn(8,1) * randn(1,8); end
A
rank(A)
내 목표에 도달 할 수 있지만 어떻게 성공적으로 작동하는지 모르겠습니까?
감사합니다, @anonymous!
답변
1 ThomasIsCoding Dec 22 2020 at 03:33
지정된 순위의 랜덤 행렬을 생성하려면 아래와 같은 사용자 함수를 만들어 볼 수 있습니다.
function [Y,rk] = fn(m,n,k)
P = orth(randn(m,k));
Q = orth(randn(n,k))';
Y = P*Q;
rk = rank(Y);
end
여기서, P
및 Q
유니 터리 행렬이다. Y
무작위 값으로 생성 된 행렬이며 rk
순위를 확인하는 데 도움이됩니다.
예
>> [Y,rk] = fn(8,6,5)
Y =
3.8613e-02 7.5837e-03 -7.1011e-02 -7.0392e-02 -3.8519e-02 1.6612e-01
-3.1381e-02 -3.6287e-02 1.4888e-01 -7.6202e-02 -3.7867e-02 3.2707e-01
-1.9689e-01 2.2684e-01 1.2606e-01 -1.2657e-03 1.9724e-01 7.2793e-02
-1.2652e-01 7.7531e-02 1.3906e-01 3.1568e-02 1.8327e-01 -1.3804e-01
-2.6604e-01 -1.4345e-01 1.6961e-03 -9.7833e-02 5.9299e-01 -1.5765e-01
1.7787e-01 -3.5007e-01 3.8482e-01 -6.0741e-02 -2.1415e-02 -2.4317e-01
8.9910e-02 -2.5538e-01 -1.8029e-01 -7.0032e-02 -1.0739e-01 2.2188e-01
-3.4824e-01 3.7603e-01 2.8561e-02 2.6553e-02 2.4871e-02 6.8021e-01
rk = 5
1 OmG Dec 22 2020 at 03:35
eye
기능을 쉽게 사용할 수 있습니다 .
I = eye(k);
M = zeros(m,n);
M(1:k, 1:k) = I;
는 rank(M)
입니다 k
.