使用随机列和循环创建子矩阵

时间:2018-02-12 20:29:20

标签: matlab matrix random submatrix

我有一个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提取不同订单的矩阵。使用上面的代码,我每次更改mattsub时都必须更改cols行。我相信它可以用另一个循环进行,但无法弄清楚如何。我怎么能这样做?

3 个答案:

答案 0 :(得分:0)

你不需要另一个循环,一个就足够了。如果使用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

答案 1 :(得分:0)

使用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);

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

答案 2 :(得分:0)

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

而不是:

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

使用此:

mattsub = matt(rr, rr);