我有这项工作,我必须通过从给定数据集创建子矩阵来做。我将在下面解释。
假设我将数据设置为:
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(留一个)实现这个数据集,以便我可以进一步开展它。
如果您对如何操作有任何想法,请分享。 :)
答案 0 :(得分:0)
假设A
是主矩阵,a1
和a2
将是您的第一组子矩阵,b1
和b2
将是第二组子矩阵集。
>> 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工具箱,那么你可以使用他们的内置交叉验证功能。请参阅cvpartition
或crossvalind