使用Matlab随机拆分Excel工作表

时间:2015-04-29 07:26:15

标签: matlab

我有一张包含1838条记录的Excel表格,我需要随机将这些记录拆分为3条Excel表格。我正在尝试使用Matlab,但我对它很新,我刚刚管理了以下代码:

[xlsn, xlst, raw] = xlsread('data.xls');

numrows = 1838; 

randindex = ceil(3*rand(numrows, 1));

raw1 = raw(:,randindex==1);
raw2 = raw(:,randindex==2);
raw3 = raw(:,randindex==3);

1 个答案:

答案 0 :(得分:2)

您的一般程序是将电子表格读入一些matlab变量,对这些矩阵进行操作,最终得到三分之三,然后再将三分之一写回来。

因此,您已获得xlsread覆盖的阅读,从而导致两个矩阵xlsnumxlstxt。我建议使用语法

[~, ~, raw] = xlsread('data.xls');

xlsread帮助文件中(您可以通过在命令窗口中键入doc xlsread来访问它),它表示三个输出参数包含数字单元格,文本单元格和整个批次。这是因为matlab矩阵只能包含一种类型的值,而电子表格通常应该包含文本或数字。 raw值将保留所有值,但在“'单元格阵列”中。相反,一种不同类型的matlab数据类型。

那么你将有一个单元格数组raw。从这里你想做三件事:

  1. 通过使用size函数并指定适当的维度(再次检查帮助文件以了解如何执行此操作)计算出您有多少行(我假设每条记录都是一行)
  2. 创建一个介于1和3之间的随机数索引,您可以将其用作遮罩

    randindex = ceil(3*rand(numrows, 1));

  3. 将蒙版应用于单元格数组以提取与每个索引匹配的记录

    raw1 = raw(:,randindex==1); % do the same for the other two index values

  4. 将每个单元格写回文件

    xlswrite('output1.xls', raw1);

  5. 您可能需要获取参数以使其按您希望的方式工作,但请务必检查doc functionname页面以获得恰到好处的语法。您的主要关注点是使索引正确 - matlab索引排在第一位,而电子表格往往是第一列(例如,单元格A2是第A列和第2行,但是matlab矩阵元素M(1,2)是第一行,矩阵M的第二列,即单元格B1)。

    更新:平均分割文件更加麻烦:因为我们使用随机数作为索引,所以不能保证均匀分割。因此,我们可以生成一个随机浮点数的向量,然后选出最低的33%来制作索引1,最高的33制作索引3,其余的则为2。

    randvec = rand(numrows, 1); % float between 0 and 1
    pct33 = prctile(randvec,100/3); % value of 33rd percentile
    pct67 = prctile(randvec,200/3); % value of 67th percentile
    randindex = ones(numrows,1);
    randindex(randvec>pct33) = 2;
    randindex(randvec>pct67) = 3;
    

    它可能仍然绝对不会 - 1838不是3的倍数。你可以看到每个小组都有这么多成员

    numel(find(randindex==1))