【问题标题】:What is a way to create a large matrix of smaller matrices with varying parameters什么是创建具有不同参数的较小矩阵的大矩阵的方法
【发布时间】:2015-07-28 12:35:28
【问题描述】:

我有一个维度为 5-by-4 的矩阵,其元素是 2 个参数 beta1beta2 的函数,它有 50 个值每个。

5-by-4 矩阵的形式为

for i=1:5
   factors(i,:)=  [1,...
                  1-exp(-terms(i)/beta1) /(terms(i)/beta1), ...
                  (1-exp(-terms(i)/beta1))/(terms(i)/beta1)-exp(-terms(i)/beta1), ...
                  (1-exp(-terms(i)/beta2))/(terms(i)/beta2)-exp(-terms(i)/beta2)];
end

我想创建一个更大的矩阵,其列包含 50 个 5-by-4 矩阵,具有不同的 beta1 和固定的 beta2。这些行包含 50 个 5-by-4 矩阵,具有不同的 beta2 和固定的 beta1。所以较大矩阵的维度是 250-by-200

是否有一个函数或循环可以帮助我解决这个问题?我已经被困了很长时间了。

【问题讨论】:

  • beta的元素功能如何?你有一个函数()?
  • for i=1:5 因子(i,:)=[1, (1-exp(-terms(i)/beta1)/(terms(i)/beta1)), (1 -exp(-terms(i)/beta1))/(terms(i)/beta1)-exp(-terms(i)/beta1), (1-exp(-terms(i)/beta2))/(terms (i)/beta2)-exp(-terms(i)/beta2)];结束
  • 您是否只需将 5 x 4 矩阵复制 50 次并将它们堆叠在一起?或者您的函数是否需要重新评估较大矩阵的每个元素?即你的函数现在应该是 i = 1:250 ?

标签: matlab loops matrix


【解决方案1】:

我假设您拥有或可以编写一个接受两个参数并输出您的 5-by-4 矩阵的函数,即

function m = f(beta1, beta2) %// You must write f yourself. m is a 5-by-4 matrix

那么最简单的解决方案就是创建一个嵌套循环(当然是为了提高效率而进行预分配)。请注意,我还假设您知道如何改变 beta1beta2,并且您将把它们放在 50-by-1 向量 B1B2你自己:

M = zeros(250,200);
b1 = 1;
for r = 1:5:(250-5)
    b2 = 1;
    for c = 1:4:(200-4)
        M(r:r+4,c:c+3) = f(B1(b1), B2(b2));
        b2 = b2+1;
    end
    b1 = b1+1;
end

【讨论】:

    【解决方案2】:

    假设我有一个取决于其他 2 个值的值。我可以写一个函数来计算这个说myfun = @(x,y) x + y。我可以将它与 arrayfun 或 bsxfun 等一起使用,以快速计算所有 xy 的值。

    x = rand(1000,1);
    y = rand(1000,1);
    res = arrayfun(myfun, x, y);
    

    在您的情况下,您需要提前定义terms,然后根据需要更改beta1beta2。需要注意的一件事是,arrayfun 希望所有变量的大小相同,因此请使用 repmat 或类似方法来重塑 beta1 和 beta2。例如

    terms = 1:5;
    i = 1:5;
    myfun = @(beta1, beta2) [1, (1-exp(-terms(i)/beta1)/(terms(i)/beta1)), (1-exp(-terms(i)/beta1))/ (terms(i)/beta1)-exp(-terms(i)/beta1), (1-exp(-terms(i)/beta2))/(terms(i)/beta2)-exp(-terms(i)/beta2)];
    beta1 = repmat(rand(1,1),1,5);
    beta2 = repmat(rand(1,1),1,5);
    results = arrayfun(myfun, beta1, beta2,i,'UniformOutput',0);
    

    它的输出将是一个数组单元。我相信在后台 arrayfun 只是一个循环,但它应该由 MathWorks 向量化,所以它应该很快。

    要创建不同的 beta1 和固定的 beta2,只需将它们定义为 beta1 在向量的前半部分变化,在后半部分固定。例如:

    beta1 = ones(250,1) * 10;
    beta1(1:125) = 1:125;
    

    等等。

    【讨论】:

      【解决方案3】:

      这是一个明确的示例,可以概括并轻松验证以给出正确的结果。只需将 m0 的定义更改为您的 5x4 矩阵:

      %define beta variables as parameter lists:
      beta1 = linspace(10,40,4);
      beta2 = linspace(1,4,4);
      L1    = length(beta1);
      L2    = length(beta2);
      
      %define m0 as your 5x4 matrix:
      m0 = @(b1,b2)[b1, b2, 0 ; 0, 0, 0];
      m = zeros(size(m0(1,1)));
      [nrows,ncols] = size(m);
      
      for q1 = 1:L1
          for q2 = 1:L2
      
              rows = (1:nrows) + (q2-1)*nrows;
              cols = (1:ncols) + (q1-1)*ncols;
              m(rows,cols) = m0(beta1(q1),beta2(q2));
          end
      end
      
      m0(10,1)
      m
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-11-25
        • 1970-01-01
        • 2013-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多