我有一个102- by -102矩阵。我想使用随机列号从2
到8
选择订单的方形子矩阵。这是我到目前为止所做的。
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
我必须从2
到8
提取不同订单的矩阵。使用上面的代码,我每次更改mattsub
时都必须更改cols
行。我相信它可以用另一个循环进行,但无法弄清楚如何。我怎么能这样做?
答案 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
投影它们。在迭代中,可以使用randperm和sort函数来构建原始矩阵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);