Làm thế nào để tạo một ma trận mxn với một thứ hạng cụ thể trong Matlab?

Dec 22 2020

Tôi muốn tạo một m by nma trận với thứ hạng k.

Giống như A8 × 8với thứ hạng 5hoặc B4 × 6với thứ hạng 4.

Vì vậy, tôi thử viết một hàm trong MATLAB như bên dưới.

Suy nghĩ của tôi là:

  1. tạo ma trận mbằng nsố không
  2. tạo mbằng nma trận và chuyển nó thành dạng cấp bậc hàng giảm
  3. gán hạng của ma trận 2. cho num
  4. nếu num = k, sau đó gán ma trận hiện tại cho đầu ra
  5. phá vỡ sự lặp lại
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)

Kết quả là một vòng lặp vô hạn và tất cả các câu trả lời là 6x6ma trận số không: Đầu ra cửa sổ lệnh


Tôi cũng đã thử phương pháp trong cách tạo ma trận hạng k bằng matlab?

A = zeros(8,8);
for i = 1:4, A = A + randn(8,1) * randn(1,8); end
A
rank(A)

Nó có thể đạt được mục tiêu của tôi, nhưng tôi không biết nó hoạt động thành công như thế nào?

Cảm ơn, @anonymous!

Trả lời

1 ThomasIsCoding Dec 22 2020 at 03:33

Nếu bạn muốn tạo một ma trận ngẫu nhiên với thứ hạng được chỉ định, bạn có thể thử tạo một hàm người dùng như bên dưới

function [Y,rk] = fn(m,n,k)
  P = orth(randn(m,k));
  Q = orth(randn(n,k))';
  Y = P*Q;
  rk = rank(Y);
end

ma trận đơn nhất ở đâu Pvà ở đâu Q. Ylà ma trận được tạo với các giá trị ngẫu nhiên và rkgiúp bạn kiểm tra thứ hạng.


Thí dụ

>> [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

Bạn có thể dễ dàng sử dụng eyechức năng:

I = eye(k);
M = zeros(m,n);
M(1:k, 1:k) = I;

rank(M)bằng với k.