我有一张包含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);
答案 0 :(得分:2)
您的一般程序是将电子表格读入一些matlab变量,对这些矩阵进行操作,最终得到三分之三,然后再将三分之一写回来。
因此,您已获得xlsread
覆盖的阅读,从而导致两个矩阵xlsnum
和xlstxt
。我建议使用语法
[~, ~, raw] = xlsread('data.xls');
在xlsread
帮助文件中(您可以通过在命令窗口中键入doc xlsread
来访问它),它表示三个输出参数包含数字单元格,文本单元格和整个批次。这是因为matlab矩阵只能包含一种类型的值,而电子表格通常应该包含文本或数字。 raw
值将保留所有值,但在“'单元格阵列”中。相反,一种不同类型的matlab数据类型。
那么你将有一个单元格数组raw
。从这里你想做三件事:
size
函数并指定适当的维度(再次检查帮助文件以了解如何执行此操作)计算出您有多少行(我假设每条记录都是一行)创建一个介于1和3之间的随机数索引,您可以将其用作遮罩
randindex = ceil(3*rand(numrows, 1));
将蒙版应用于单元格数组以提取与每个索引匹配的记录
raw1 = raw(:,randindex==1); % do the same for the other two index values
将每个单元格写回文件
xlswrite('output1.xls', raw1);
您可能需要获取参数以使其按您希望的方式工作,但请务必检查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))