用Matlab实现Excel表格的随机拆分
我有一张包含1838条记录的Excel表格,我需要将这些记录随机分成3张Excel表格。我正在尝试使用Matlab,但我对它非常陌生,我刚刚管理了以下代码:用Matlab实现Excel表格的随机拆分,matlab,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(:,ran
[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);
您的一般程序是将电子表格读入一些matlab变量,对这些矩阵进行运算,最后得到三分之三,然后将每三分之一写出来 因此,您已经用
xlsread
覆盖了读取,这将导致两个矩阵xlsnum
和xlstxt
。我建议使用语法
[~, ~, raw] = xlsread('data.xls');
在xlsread
帮助文件中(您可以通过在命令窗口中键入doc xlsread
来访问此文件),它表示三个输出参数包含数字单元格、文本单元格和整个批次。这是因为matlab矩阵只能保存一种类型的值,而电子表格通常需要有文本或数字。raw
值将保存所有的值,但在“单元数组”中,它是一种不同的matlab数据类型
因此,您将拥有一个单元格数组valledraw
。在这里,您需要做三件事:
size
函数并指定适当的维度,计算出您有多少行(我假设每条记录都是一行)(再次查看帮助文件以了解如何执行此操作)randindex=ceil(3*rand(numrows,1))代码>
raw1=raw(:,randindex==1);%对其他两个索引值执行相同操作
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))
如果没有实际的xls表,很难判断出哪里出了问题-当我使用
magic
生成测试矩阵时,它对我来说是有效的,但这并不说明什么。使用size(raw)
检查raw
数组的大小。我会用它来定义numrows
而不是硬编码它,它对这样的事情更健壮。原始数组完美地包含了所有的数据集,它是1839*20,请问raw1=raw(:,randindex==1)在做什么?我必须包含任何循环吗?解决问题的主要方法可能是交换索引。尝试使用raw(randindex==1,:)
代替。花点时间阅读一下matlab如何索引值()可能会很有用。您使用的是单元阵列,因此存在一些差异,但原理是相同的。