如何在 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
是主矩阵,a1
和a2
将是你的第一组sub-matrices和b1
和b2
将是第二组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
我有这项工作,我必须通过从给定数据集创建子矩阵来完成。我会在下面解释。
假设,我将数据设置为:
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
是主矩阵,a1
和a2
将是你的第一组sub-matrices和b1
和b2
将是第二组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