[英]How to select vector elements from each row of a 3D matrix in MATLAB?
我有一個3D矩陣,例如1000 x 4 x 20矩陣A,我想根據1000 x 1索引矢量B從A的每一行中選擇1 x 20矢量。此索引向量包含1到4的數字。而且,我不想使用for循環。 我應該怎么做(有和沒有“ sub2ind”)?
謝謝。
我不確定這是最優雅的方法,但是可以完成工作:
[r,c,~]=size(A);
Q=reshape(A,r*c,[]);
P=sub2ind([r,c],[1:r]',B);
result=Q(P,:);
這會將每個1x1x20向量放入1000x20結果矩陣的相應行中。 如果需要,可以合並最后兩行。
這是樣本的前20行,向量B
附加在前面,以顯示我們應該取哪一列。 A
的構造應該非常明顯(第一個數字是列號,接下來的3個是行號-1。1x1x20向量的所有元素都相同。)
B result
2 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000
1 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001
4 4002 4002 4002 4002 4002 4002 4002 4002 4002 4002 4002 4002 4002 4002 4002 4002 4002 4002 4002 4002
4 4003 4003 4003 4003 4003 4003 4003 4003 4003 4003 4003 4003 4003 4003 4003 4003 4003 4003 4003 4003
3 3004 3004 3004 3004 3004 3004 3004 3004 3004 3004 3004 3004 3004 3004 3004 3004 3004 3004 3004 3004
4 4005 4005 4005 4005 4005 4005 4005 4005 4005 4005 4005 4005 4005 4005 4005 4005 4005 4005 4005 4005
3 3006 3006 3006 3006 3006 3006 3006 3006 3006 3006 3006 3006 3006 3006 3006 3006 3006 3006 3006 3006
1 1007 1007 1007 1007 1007 1007 1007 1007 1007 1007 1007 1007 1007 1007 1007 1007 1007 1007 1007 1007
3 3008 3008 3008 3008 3008 3008 3008 3008 3008 3008 3008 3008 3008 3008 3008 3008 3008 3008 3008 3008
4 4009 4009 4009 4009 4009 4009 4009 4009 4009 4009 4009 4009 4009 4009 4009 4009 4009 4009 4009 4009
2 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010
4 4011 4011 4011 4011 4011 4011 4011 4011 4011 4011 4011 4011 4011 4011 4011 4011 4011 4011 4011 4011
3 3012 3012 3012 3012 3012 3012 3012 3012 3012 3012 3012 3012 3012 3012 3012 3012 3012 3012 3012 3012
2 2013 2013 2013 2013 2013 2013 2013 2013 2013 2013 2013 2013 2013 2013 2013 2013 2013 2013 2013 2013
4 4014 4014 4014 4014 4014 4014 4014 4014 4014 4014 4014 4014 4014 4014 4014 4014 4014 4014 4014 4014
4 4015 4015 4015 4015 4015 4015 4015 4015 4015 4015 4015 4015 4015 4015 4015 4015 4015 4015 4015 4015
1 1016 1016 1016 1016 1016 1016 1016 1016 1016 1016 1016 1016 1016 1016 1016 1016 1016 1016 1016 1016
2 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017
4 4018 4018 4018 4018 4018 4018 4018 4018 4018 4018 4018 4018 4018 4018 4018 4018 4018 4018 4018 4018
3 3019 3019 3019 3019 3019 3019 3019 3019 3019 3019 3019 3019 3019 3019 3019 3019 3019 3019 3019 3019
這是使用bsxfun
的另一種方式:
[r, c, t] = size(A);
result = A(bsxfun(@plus, (1:r).'+r*(B-1), (0:t-1)*r*c));
假設向量稱為A
您可以像這樣對它建立索引:
A(1:1000,B,:)
其中index1的范圍是1到1000,而index2的范圍是1到4。冒號選擇該索引級別的所有內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.