如何在 MATLAB 中创建子矩阵

How to create a sub-matrix in MATLAB

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

假设,我将数据设置为:

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]]

依此类推...该过程将一直持续到 main/starting 矩阵中的行数。

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

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

假设A是主矩阵,a1a2将是你的第一组sub-matrices和b1b2将是第二组sub-matrices.

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

适当的索引是您的朋友。对于给定的矩阵:

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);

由于您要对矩阵的所有 two-rows 组合执行此操作,因此可以使用 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

如果您有统计和 ML 工具箱,那么您可以使用它们的 built-in 交叉验证功能。参见 cvpartition or crossvalind