从起始元素和大小中提取矩阵元素
Extract elements of matrix from a starting element and size
抱歉标题不好,我很难把这个问题说清楚。基本上我想做的是从二维矩阵中逐行提取元素,从特定列 (k) 开始提取多个元素 (N)。在 for 循环中,这看起来像。
A = magic(6);
k = [2,2,3,3,4,4]; % for example
N = 3;
for j = 1:length(A)
B(j,:) = A(j,k(j):k(j)+N-1);
end
我认为一定有比这更简洁的方法。
您可以使用 bsxfun
创建要使用的索引数组。然后将其与行号组合并将其传递给 sub2ind
.
inds = sub2ind(size(A), repmat(1:size(A, 1), 3, 1), bsxfun(@plus, k, (0:(N-1))')).';
B = A(inds);
或者不使用 sub2ind
(但稍微更隐晦)。
B = A(bsxfun(@plus, 1:size(A,1), ((bsxfun(@plus, k, (0:(N-1)).')-1) * size(A,1))).');
这是一种使用 bsxfun's
masking capability and thus logical indexing
-
的方法
C = (1:size(A,2))';
At = A.';
B = reshape(At(bsxfun(@ge,C,k) & bsxfun(@lt,C,k+N)),N,[]).';
抱歉标题不好,我很难把这个问题说清楚。基本上我想做的是从二维矩阵中逐行提取元素,从特定列 (k) 开始提取多个元素 (N)。在 for 循环中,这看起来像。
A = magic(6);
k = [2,2,3,3,4,4]; % for example
N = 3;
for j = 1:length(A)
B(j,:) = A(j,k(j):k(j)+N-1);
end
我认为一定有比这更简洁的方法。
您可以使用 bsxfun
创建要使用的索引数组。然后将其与行号组合并将其传递给 sub2ind
.
inds = sub2ind(size(A), repmat(1:size(A, 1), 3, 1), bsxfun(@plus, k, (0:(N-1))')).';
B = A(inds);
或者不使用 sub2ind
(但稍微更隐晦)。
B = A(bsxfun(@plus, 1:size(A,1), ((bsxfun(@plus, k, (0:(N-1)).')-1) * size(A,1))).');
这是一种使用 bsxfun's
masking capability and thus logical indexing
-
C = (1:size(A,2))';
At = A.';
B = reshape(At(bsxfun(@ge,C,k) & bsxfun(@lt,C,k+N)),N,[]).';