matlab 如何根据列中的值将一个非常大的矩阵拆分为子矩阵?

vc9ivgsu  于 2023-02-05  发布在  Matlab
关注(0)|答案(2)|浏览(346)

我有一个5 x 600,000的矩阵。我想对数据进行分组,所以我想根据第4列中的值将此矩阵分组为子矩阵。
对于0到500之间的值,我需要一个矩阵;对于501到1000之间的值,我需要另一个矩阵;对于1001到1500之间的值,我需要另一个矩阵。
我该怎么做呢?
我目前没有任何可靠的材料,我在网上看到过一些例子,但它们似乎只有2个变量(即在一列中有值1或0,并将1和0分组为2个子矩阵)。

68de4m5k

68de4m5k1#

我认为在Matlab语言中,你的意思是你有一个n × m矩阵,其中n=600000,m=5,但如果不是,你可以相应地改变。
这就是你想做的吗

n=600000; 
m=5;
thisCol =4;

values_range = {[0,500];[501,1000];[1001,1500]};  % cell array of vectors
myMatrix = zeros(n,m);
myMatrix(:,thisCol) = 1:600000;  % to prove it works.

theseSubMatrices = cell(length(values_range),1); % cell array of matrices
for j=1:length(values_range)
    thisLow= values_range{j}(1);
    thisHigh= values_range{j}(2);
    theseSubMatrices{j} = myMatrix(myMatrix(:,thisCol)>=thisLow & myMatrix(:,thisCol)<=thisHigh,:);
end
cx6n0qe3

cx6n0qe32#

如果你有一些数据

arr = rand( 6e5, 5 ); % 5 columns / 600,000 rows
arr(:,5) = arr(:,5) .* 1500; % for this example, get column 5 into range [0,1500]

然后,您可以使用histcounts根据您的边缘“bin”第5列。

edges = [0, 500, 1000, 1500]; % edges to split column 5 by
[~,~,iSubArr] = histcounts( arr(:,5), edges );

并生成每个子数组一个元素的单元数组

nSubArr = numel(edges)-1; % number of bins / subarrays
subArrs = arrayfun( @(x) arr( iSubArr == x, : ), 1:nSubArr, 'uni', 0 ); % Get a matrix per bin

输出:

subArrs =
  1×3 cell array
    {200521×5 double}    {199924×5 double}    {199555×5 double}

相关问题