使用随机列和循环创建子矩阵
Create a submatrix using random columns and loop
我有一个 102-by-102 矩阵。我想使用随机列号 select 对从 2
到 8
的订单的子矩阵进行平方。这是我到目前为止所做的。
matt
是大小为102-by-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
的不同阶数的矩阵。使用上面的代码,我每次更改 cols
时都必须更改 mattsub
行。我相信可以在内部使用另一个循环,但不知道如何做。我该怎么做?
你不需要另一个循环,一个就足够了。如果您使用 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
使用 randi function. Once this is done, they can be projected along your iterations number N
using arrayfun. Within the iterations, the randperm and 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);
这适用于任何类型的矩阵,甚至是非平方矩阵。
不需要提取向量的元素并将它们连接起来,只需使用向量来索引矩阵。
而不是:
mattsub = matt([rr(1) rr(2) rr(3)], [rr(1) rr(2) rr(3)]);
使用这个:
mattsub = matt(rr, rr);
我有一个 102-by-102 矩阵。我想使用随机列号 select 对从 2
到 8
的订单的子矩阵进行平方。这是我到目前为止所做的。
matt
是大小为102-by-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
的不同阶数的矩阵。使用上面的代码,我每次更改 cols
时都必须更改 mattsub
行。我相信可以在内部使用另一个循环,但不知道如何做。我该怎么做?
你不需要另一个循环,一个就足够了。如果您使用 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
使用 randi function. Once this is done, they can be projected along your iterations number N
using arrayfun. Within the iterations, the randperm and 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);
这适用于任何类型的矩阵,甚至是非平方矩阵。
不需要提取向量的元素并将它们连接起来,只需使用向量来索引矩阵。
而不是:
mattsub = matt([rr(1) rr(2) rr(3)], [rr(1) rr(2) rr(3)]);
使用这个:
mattsub = matt(rr, rr);