如何在 matlab 中创建具有特定等级的 mxn 矩阵?
How to create a mxn matrix with a specific rank in matlab?
我想创建一个 m by n
矩阵,秩为 k
。
比如 A
是 8 × 8
,排名 5
或 B
是 4 × 6
,排名 4
。
所以我尝试在 MATLAB 中编写一个函数,如下所示。
我的想法是:
- 通过
n
零矩阵 生成一个 m
- 通过
n
矩阵生成m
并将其转化为简化的行梯形
- 将 2. 的矩阵的秩分配给 num
- if
num = k
, then assign current matrix to the output
- 中断迭代
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
零矩阵:
Command Window Output
我也试过how to create a rank k matrix using matlab?
中的方法
A = zeros(8,8);
for i = 1:4, A = A + randn(8,1) * randn(1,8); end
A
rank(A)
它可以达到我的目标,但我不知道它是如何成功的?
谢谢,@anonymous!
如果你想生成一个指定秩的随机矩阵,你可以尝试构建一个用户函数,如下所示
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
您可以轻松使用eye
函数:
I = eye(k);
M = zeros(m,n);
M(1:k, 1:k) = I;
rank(M)
等于k
。
我想创建一个 m by n
矩阵,秩为 k
。
比如 A
是 8 × 8
,排名 5
或 B
是 4 × 6
,排名 4
。
所以我尝试在 MATLAB 中编写一个函数,如下所示。
我的想法是:
- 通过
n
零矩阵 生成一个 - 通过
n
矩阵生成m
并将其转化为简化的行梯形 - 将 2. 的矩阵的秩分配给 num
- if
num = k
, then assign current matrix to the output - 中断迭代
m
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
零矩阵:
Command Window Output
我也试过how to create a rank k matrix using matlab?
中的方法A = zeros(8,8);
for i = 1:4, A = A + randn(8,1) * randn(1,8); end
A
rank(A)
它可以达到我的目标,但我不知道它是如何成功的?
谢谢,@anonymous!
如果你想生成一个指定秩的随机矩阵,你可以尝试构建一个用户函数,如下所示
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
您可以轻松使用eye
函数:
I = eye(k);
M = zeros(m,n);
M(1:k, 1:k) = I;
rank(M)
等于k
。