【问题标题】:How to create a sub-matrix in MATLAB如何在 MATLAB 中创建子矩阵
【发布时间】:2018-08-10 09:08:08
【问题描述】:

我有这项工作,我必须通过从给定数据集创建一个子矩阵来完成。我会在下面解释。

假设,我将数据设置为:

100  200  300  400  500  600
101  201  301  401  501  601
102  202  302  402  502  602

所以,我想创建如下子矩阵:

对于第一次迭代 ->

[[101  201  301  401  501]
[102  202  302  402  502]]

[[601]
[602]]

对于第二次迭代 ->

[[100  200  300  400  500]
[102  202  302  402  502]]

[[600]
[602]]

等等……这个过程将一直持续到主/起始矩阵中的行数。

简而言之,我想要这个数据集的 LOO(留一个)实现,以便我可以进一步处理它。

如果你们对如何做有任何想法,请分享。 :)

【问题讨论】:

  • 您需要提供一些您尝试用于解决问题的代码。我们不是来解决别人的作业的。
  • 我想实际使用连接运算符,因为它似乎可以解决问题。我正在尝试类似:sub = [mat(1:1052) ; mat(5)] 但是,它不起作用。有什么想法吗?

标签: matlab matrix machine-learning submatrix


【解决方案1】:

如果您有统计信息和机器学习工具箱,那么您可以使用它们内置的交叉验证功能。见cvpartitioncrossvalind

【讨论】:

    【解决方案2】:

    正确的索引是您的朋友。对于给定的矩阵:

    X = [
       100  200  300  400  500  600
       101  201  301  401  501  601
       102  202  302  402  502  602
    ];
    

    第一个子集是:

    S1A = X(2:3,1:end-1);
    S1B = X(2:3,end);
    

    第二个子集是:

    S2A = X(1:3,1:end-1);
    S2B = X(1:3,end);
    

    由于您要对矩阵的所有两行组合执行此操作,因此可以使用nchoosek function 生成行索引模式,如下所示:

    X_seq = 1:numel(x);
    idx = nchoosek(X_seq,2);
    

    然后,通过迭代(只是为了简单起见......始终建议在 Matlab 中尽可能多地矢量化计算),您可以提取所有匹配项:

    idx_len = size(idx,1);
    res = cell(idx_len,2);
    
    for i = 1:idx_len
        idx_curr = idx(i,:);
        res(i,:) = {X(idx_curr,1:end-1) X(idx_curr,end)};
    end
    

    【讨论】:

    • 总是推荐vectorise
    • 感谢 helo @Tommaso .. 但是我得到了一个更简单的迭代解决方案。我将在下面发布。 :)
    • 为什么不总是推荐向量化变量? @SardarUsama
    • @MaJoR21 这取决于手头的任务。矢量化计算是内存密集型的,如果内存有限制,循环是可行的方法。此外,Mathworks 在较新的版本中对循环进行了显着改进,因此不应不必要地皱眉。
    【解决方案3】:

    假设 A 是主矩阵,a1a2 将是您的第一组子矩阵,b1b2 将是第二组子矩阵。

    >> A=[100  200  300  400  500  600
        101  201  301  401  501  601
        102  202  302  402  502  602];
    >> a1=A(2:3,1:5)
    
        a1 =
    
       101   201   301   401   501
       102   202   302   402   502
    
    >> a2=A(2:3,6)
    
    a2 =
    
       601
       602
    
    >> b1=A(1:2,1:5)
    
    b1 =
    
       100   200   300   400   500
       101   201   301   401   501
    
    >> b2=A(1:2,6)
    
    b2 =
    
       600
       601
    

    【讨论】:

    • 是的。这就是我一直在寻找的。连接运算符的使用。我已经将它与更大数据集的迭代循环结合起来。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    • 2014-06-04
    • 1970-01-01
    • 2016-03-08
    • 2015-09-20
    • 2011-05-09
    • 2020-01-29
    相关资源
    最近更新 更多