【问题标题】:Create a submatrix using random columns and loop使用随机列和循环创建子矩阵
【发布时间】:2024-04-26 15:55:02
【问题描述】:

我有一个 102-by-102 矩阵。我想使用随机列号从28 中选择订单的平方子矩阵。这是我到目前为止所做的。

matt 是大小为 102--102 的原始矩阵。

ittr = 30
cols = 3;
for i = 1:ittr
   rr = randi([2,102], cols,1);
   mattsub = matt([rr(1) rr(2) rr(3)], [rr(1) rr(2) rr(3)]);
end

我必须从28 中提取不同阶的矩阵。使用上面的代码,我每次更改cols 时都必须更改mattsub 行。我相信可以在内部使用另一个循环,但无法弄清楚如何。我该怎么做?

【问题讨论】:

  • 你不能写mattsub = matt(rr, rr);吗?
  • 循环的目的是什么?
  • 它没有。代码中的循环除了用随机数多次覆盖rrmattsub 之外什么也不做。
  • 你说的很对。出于这个问题的目的,我不需要循环。可能我无意中包含了它,因为它存在于剩余的代码中,或者我可能在想(如标题所述)解决方案可能涉及另一个循环,那么如何同时处理两者?

标签: matlab matrix random submatrix


【解决方案1】:

不需要提取向量的元素并将它们连接起来,只需使用向量来索引矩阵即可。

而不是:

mattsub = matt([rr(1) rr(2) rr(3)], [rr(1) rr(2) rr(3)]);

使用这个:

mattsub = matt(rr, rr);

【讨论】:

    【解决方案2】:

    使用randi 函数定义一组随机大小非常容易。完成此操作后,可以使用arrayfun 将它们沿您的迭代编号N 投影。在迭代中,可以使用randpermsort 函数来构建原始矩阵M 的随机索引器。

    这里是完整的代码:

    % Define the starting parameters...
    M = rand(102);
    N = 30;
    
    % Retrieve the matrix rows and columns...
    M_rows = size(M,1);
    M_cols = size(M,2);
    
    % Create a vector of random sizes between 2 and 8...
    sizes = randi(7,N,1) + 1;
    
    % Generate the random submatrices and insert them into a vector of cells...
    subs = arrayfun(@(x)M(sort(randperm(M_rows,x)),sort(randperm(M_cols,x))),sizes,'UniformOutput',false);
    

    这适用于任何类型的矩阵,甚至是非平方矩阵。

    【讨论】:

      【解决方案3】:

      你不需要另一个循环,一个就足够了。如果您使用randi 获得一个随机整数作为子矩阵的大小,然后使用它们获得随机列和行索引,您可以轻松获得一个随机子矩阵。请注意,输出是一个单元格,因为子矩阵的大小不同。

      N=102; % Or substitute with some size function
      matt = rand(N); % Initial matrix, use your own
      itr = 30; % Number of iterations
      mattsub = cell(itr,1); % Cell for non-uniform output
      for ii = 1:itr
          X = randi(7)+1; % Get random integer between 2 and 7
          colr = randi(N-X); % Random column
          rowr = randi(N-X); % random row
          mattsub{ii} = matt(rowr:(rowr+X-1),colr:(colr+X-1));
      end
      

      【讨论】: