如何在MATLAB中创建子矩阵

时间:2018-03-02 07:05:54

标签: matlab matrix machine-learning submatrix

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

假设我将数据设置为:

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(留一个)实现这个数据集,以便我可以进一步开展它。

如果您对如何操作有任何想法,请分享。 :)

3 个答案:

答案 0 :(得分:0)

假设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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

如果你有统计数据和ML工具箱,那么你可以使用他们的内置交叉验证功能。请参阅cvpartitioncrossvalind