首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MATLAB:将多组列提取到子矩阵中?

MATLAB:将多组列提取到子矩阵中?
EN

Stack Overflow用户
提问于 2012-04-13 18:34:24
回答 3查看 15.2K关注 0票数 1

我有一个数据集,我想在其中提取列1-3、7-9、13-15,一直到矩阵的末尾

作为示例,我使用标准的魔术函数创建了一个矩阵

A=magic(10)

A=

代码语言:javascript
复制
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: end)

Aex =

代码语言:javascript
复制
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等)。

有没有一种方法可以做到这一点,而不必手动指出所有的列号?

谢谢你的帮忙!Rasmus

EN

回答 3

Stack Overflow用户

发布于 2012-04-13 18:43:46

这就是你要找的吗:

代码语言:javascript
复制
 Aex = A(:,[1:3 7:9])
票数 11
EN

Stack Overflow用户

发布于 2012-04-13 19:17:21

我假设您希望将所有结果连接到另一个大矩阵中?

如果是这样的话,试试这个的大小:

代码语言:javascript
复制
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)))

这可能可以通过一些矩阵数学规则来缩短。您还可以对这些值进行参数化,以便可以对其进行修改,以完成比此问题所期望的更多的工作(而且可能更有意义),

代码语言:javascript
复制
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...])

如果您想将它们分开,我将它们放在这里的单元格中,但它们可以转到您需要的任何位置:

代码语言:javascript
复制
a = 3;
b = 6;
results = {};
for Cols = 1:b:(size(A,2)-a)
    results{end+1} = A(:, Cols:(Cols+2));
end

我没有检查这两个的速度,但我认为第一个可能更快。您可能希望将其拆分成多个术语,以便更具可读性,我这样做只是为了适合一行(这并不总是编写代码的最佳方式)。

票数 0
EN

Stack Overflow用户

发布于 2014-01-30 18:01:18

做到这一点的简单方法:

代码语言:javascript
复制
M = magic(10);

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

但是,如果删除模式比您想要保留的列模式更简单,则可以使用以下代码:

代码语言:javascript
复制
A = magic(10);
B = A;
B(:,4:3:end)=[];
B(:,4:3:end)=[]; %Yes 3x the same line of code.
B(:,4:3:end)=[];
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10139243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档