1

マトリックスの最後まで列1〜3、7〜9、13〜15を抽出したいデータセットがあります。

例として、標準のマジック関数を使用してマトリックスを作成しました

A = magic(10)

A =

92    99     1     8    15    67    74    51    58    40
98    80     7    14    16    73    55    57    64    41
 4    81    88    20    22    54    56    63    70    47
85    87    19    21     3    60    62    69    71    28
86    93    25     2     9    61    68    75    52    34
17    24    76    83    90    42    49    26    33    65
23     5    82    89    91    48    30    32    39    66
79     6    13    95    97    29    31    38    45    72
10    12    94    96    78    35    37    44    46    53
11    18   100    77    84    36    43    50    27    59

次のコマンドを使用して、3の間隔で1から始まる単一の列を抽出できることを知っています。

Aex = a(:、1:3:終了)

Aex =

92     8    74    40
98    14    55    41
 4    20    56    47
85    21    62    28
86     2    68    34
17    83    49    65
23    89    30    66
79    95    31    72
10    96    37    53
11    77    43    59

代わりに、列のグループを抽出したいとします(たとえば、列1-3、7-9など)。

すべての列番号を手動で指摘することなくこれを行う方法はありますか?

ご協力いただきありがとうございます!ラスムス

4

3 に答える 3

11

これはあなたが探しているものですか:

 Aex = A(:,[1:3 7:9])

?

于 2012-04-13T10:43:46.053 に答える
0

これを行う簡単な方法:

M = magic(10);

n = size(M,2)
idx = sort([1:3:n 2:3:n 3:3:n])
M(:,idx)

ただし、削除のパターンが保持したい列のパターンよりも単純な場合は、代わりにこれを使用できます。

A = magic(10);
B = A;
B(:,4:3:end)=[];
B(:,4:3:end)=[]; %Yes 3x the same line of code.
B(:,4:3:end)=[];
于 2014-01-30T10:01:17.850 に答える
0

結果をすべて別の大きな行列に連結したいと思いますか?

その場合は、これを試着してサイズを確認してください。

result = A(diag(0:2)*ones(3,floor((size(A,2) - 3)/6) + 1) + ...
            ones(3,floor((size(A,2) - 3)/6) + 1)*diag(1:6:(size(A,2)-3)))

それはおそらく、いくつかの行列計算規則で短縮される可能性があります。また、値をパラメータ化して、この問題が期待する以上のことを行うように変更できるようにすることもできます (また、より理にかなっている可能性があります)。

a = 3;           
b = 6;          

result = A(diag(0:a-1)*ones(a,floor((size(A,2) - a)/b) + 1) + ...
            ones(a,floor((size(A,2) - a)/b) + 1)*diag(1:b:(size(A,2)-a)))

どこaで「グループ」のサイズ(length([1 2 3]) = length([7 8 9]) = ... = 3)などでbあり、列の間隔です([1...7...13...]あなたの例では)

それらを分離したい場合は、ここのセルに入れますが、必要な場所に移動できます。

a = 3;
b = 6;
results = {};
for Cols = 1:b:(size(A,2)-a)
    results{end+1} = A(:, Cols:(Cols+2));
end

どちらの速度も確認していませんが、前者の方が速いと思います。読みやすくするために用語に分割することもできます。私は 1 行に収まるようにしました (これは、常にコードを記述する最良の方法ではありません)。

于 2012-04-13T11:17:20.707 に答える