[英]Matlab: How can I shift columns independently in a matrix?
我有一個10X3的矩陣,我想只使用每一列的一個子集來創建一個新的矩陣,但是我希望基於索引數組和從該點開始的定義范圍,每一列的子集都不同。
例如,如果矩陣是(當我這樣做時,數字實際上不會以這種線性方式上升):
A = ...
[1 11 21
2 12 22
3 13 23
4 14 24
5 15 25
6 16 26
7 17 27
8 18 28
9 19 29
10 20 30]
並且索引數組是pos = [5,16,24]
,擴展范圍為+/- 3(因此每個索引單元的兩側有3個單元),那么我希望新矩陣為:
2 13 21
3 14 22
4 15 23
5 16 24
6 17 25
7 18 26
8 19 27
因此,在新矩陣中,索引數組引用的所有值都應對齊。
我實際上是使用更大的矩陣(最大400X100)來執行此操作的,所以我不確定循環是否是個好主意……。
感謝您的任何想法!
shift = 3;
% Prevent out of bounds
bread = NaN(shift,size(A,2));
A = [bread;A;bread]
pos = pos+shift;
% Create mask
B = zeros(size(A));
B(pos-shift) = 1;
B(pos+shift+1) = -1;
B = logical(cumsum(B));
% Select and reshape
reshape(A(B),shift*2+1,numel(pos))
您可以使用
r = 3;
B = A(bsxfun(@plus, pos, (-r:r)'));
這是使用arrayfun
的方法:
r = 3; % Spread range
B = arrayfun(@(x) A(x-r:x+r)', pos, 'UniformOutput', false);
B
將是一個單元格,但是,您可以使用以下矩陣: [B{:}]
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.