用Matlab实现Excel表格的随机拆分

用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

我有一张包含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);

您的一般程序是将电子表格读入一些matlab变量,对这些矩阵进行运算,最后得到三分之三,然后将每三分之一写出来

因此,您已经用
xlsread
覆盖了读取,这将导致两个矩阵
xlsnum
xlstxt
。我建议使用语法

[~, ~, raw] = xlsread('data.xls');
xlsread
帮助文件中(您可以通过在命令窗口中键入
doc xlsread
来访问此文件),它表示三个输出参数包含数字单元格、文本单元格和整个批次。这是因为matlab矩阵只能保存一种类型的值,而电子表格通常需要有文本或数字。
raw
值将保存所有的值,但在“单元数组”中,它是一种不同的matlab数据类型

因此,您将拥有一个单元格数组valled
raw
。在这里,您需要做三件事:

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

    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如何索引值()可能会很有用。您使用的是单元阵列,因此存在一些差异,但原理是相同的。