【问题标题】:Generating random matrix in MATLAB在 MATLAB 中生成随机矩阵
【发布时间】:2020-01-05 16:45:59
【问题描述】:

我想使用满足以下属性的 matlab 编程在 (0, 9) 中生成 100 个大小为 6 x 6 的随机矩阵 A=[a_{ij}]

 1. multiplicative inverse:      i.e., a_{ij}=1/a_{ji}      for all i,j=1,2,...,6.
 2. all entries are positive:    i.e., a_{ij}>0             for all i,j=1,2,...,6.
 3. all diagonal elements are 1: i.e., a_{ii}=1             for all i=1,2,..,6.
 4. transitive:                  i.e., a_{ih}*a_{hj}=a_{ij} for all i,j,h=1,2,...,6.

到目前为止,我尝试使用 matlab 函数rand(6)*9。但是,我得到了错误的矩阵。我想知道是否有人可以帮助我?

这是我的matlab代码:

clc; clear;
n=6;
m=0;
for i=1:n
    for j=1:n
        for h=1:n
            while m<100  % generate 100 random matrices
                A=rand(n)*9;           % random matrix in (0,9)
                A(i,j)>0;              % positive entries
                A(i,j)==1/A(j,i);      % multiplicative inverse
                A(i,h)*A(h,j)==A(i,j); % transitive
                if i==j && j==h
                    A(i,j)==1;         % diagonal elements are 1
                break;
            end
            m=m+1;
            M{m}=A
        end
    end
end
end
M{:}      

【问题讨论】:

  • 为什么要问第二个问题?
  • @Daniel 这是一个不同的问题。有间隔,没有高斯噪声。谢谢。
  • 其实所有其他属性都是从transitive属性派生而来的。
  • A(i,j)&gt;0; 例如什么都不做
  • 两个略有不同的问题,但两者的答案是相同的。选择 4 个值并计算剩余的值 (stackoverflow.com/a/59598776/2732801) 仍然不确定应如何保留随机分布的属性。 Burak 的回答基本相同,但计算出的矩阵元素的值大于 9。

标签: matlab matrix


【解决方案1】:
clear; clc
M = cell(1, 100); % preallocate memory
% matrix contains both x & 1/x
% we need a distribution whose multiplication with its inverse is uniform
pd = makedist('Triangular', 'a', 0, 'b', 1, 'c', 1);
for m=1:100 % 100 random matrices
    A = zeros(6); % allocate memory
    % 5 random numbers for 6x6 transitive random matrix
    a = random(pd, 1, 5);
    % choose a or 1/a randomly
    ac = rand(1, 5) < 0.5;
    % put these numbers above the diagonal
    for i=1:5
        if ac(i)
            A(i, i+1) = a(i);
        else
            A(i, i+1) = 1 / a(i);
        end
    end
    % complete the transitivity going above
    for k=flip(1:4)
        for i=1:k
            A(i, i-k+6) = A(i, i-k+5) * A(i-k+5, i-k+6);
        end
    end
    % lower triangle is multiplicative inverse of upper triangle
    for i=2:6
        for j=1:i-1
            A(i,j) = 1 / A(j,i);
        end
    end
    c = random(pd); % triangular random variable between (0,1)
    A = A ./ max(A(:)) * 9 * c; % range becomes (0, 9*c)
    % diagonals are 1
    for i=1:6
        A(i,i) = 1;
    end
    % insert the result
    M{m} = A;
end

在 6x6 传递矩阵中实际上有 5 个独立的数字。其他的都是从它们派生的,如代码所示。

triangular distribution用于这些数字的原因是因为三角分布的pdf是f(x)=x,而逆三角分布的pdf是f-1(x)=1 /X;因此它们的乘法变为均匀分布。 (见inverse distribution的pdf)

A = A ./ max(A(:)) * 9; 的范围是 (0,9),但总是有 9 作为最大元素。我们需要通过一个随机系数对结果进行收缩,以获得均匀分布在 (0,9) 中的结果。由于A 是均匀分布的,我们可以通过三角分布再次实现这一点。 (见product distribution

另一个解决范围问题的方法是在最大值大于 9 时计算 A。这将消除后一个问题。

由于A的所有元素都依赖于5个随机变量,它们的分布永远不会完全均匀,但这里的目的是保持它们的合理规模。

【讨论】:

  • @BurakThanks,但它为计算的矩阵元素(某些结果)生成大于 9 的值。
  • @Burak:不幸的是没有真正固定,数字在 0...9 范围内分布不均匀。如上所述,不知道如何实现这一点。
  • 刚刚意识到没有解决方案(见我的回答)。没有办法修复代码以保持均匀分布的值。至少您在预期范围内生成值并且满足所有其他要求。猜猜这是你能做到的最好的。
  • @Daniel 我不知道我得到了什么分布,但我认为这接近统一。
  • 经过一番研究,这是我发现的:它说here 逆分布的 pdf 是 x^-2*f(x)。因此,如果 f(x)=x,则 f(x)*f^-1(x) 变得一致。这就是我使用triangular distribution的原因,它有pdf f(x)=x..
【解决方案2】:

我花了一点时间思考你的问题,但我意识到没有解决办法。

您要求 A 的元素均匀分布在 (0,9) 范围内。您还需要 a_{ij}*a_{jk}=a_{ik}。由于the product of two uniform distributions 不是unifrom 发行版,因此您的问题没有解决方案。

【讨论】:

  • 如果X是三角分布,Y是逆三角分布,那么我们从X*Y得到什么分布?
猜你喜欢
  • 1970-01-01
  • 2020-04-20
  • 2016-02-15
  • 2014-10-22
  • 2013-02-08
  • 2012-04-10
  • 2013-08-24
  • 1970-01-01
  • 2016-06-30
相关资源
最近更新 更多