我有一个矢量和这样的矩阵:
v = [0.3 -3 3 -2 7 6]
INDEX = [1 3; 3 5; 4 6]
INDEX
是一个矩阵,用于指示v
行必须具有的RESULT
上的第一个和最后一个元素。我确保INDEX
中的每个间隔,即
1 to 3
,3 to 5
和4 to 6
具有相同的长度,因此RESULT
矩阵中的每一行都具有相同的长度。
我想获得这样的矩阵:
RESULT = [0.3 -3 3;
3 -2 7;
-2 7 6]
如果没有for
循环,如何执行此操作?
答案 0 :(得分:5)
确定INDEX
每行的最后一个值和第一个值之间的差异。使用此差异生成所需的索引,然后使用这些索引提取所需的值。
idx = [INDEX(:,1) INDEX(:,1)+[1:INDEX(1,end)-INDEX(1,1)]]; %Generating the indices
%for finding indices in <= R2016a, use this:
%idx = [INDEX(:,1) bsxfun(@plus, INDEX(:,1), [1:INDEX(1,end)-INDEX(1,1)])];
RESULT = v(idx);
答案 1 :(得分:0)
以下是答案:
RESULT = v(cell2mat(arrayfun(@colon,INDEX(:,1),INDEX(:,2),&#39; Uniform&#39;,false)))
以下是它的工作原理:
您应首先制作一个包含INDEX
矩阵的所有索引的矩阵。
下面的代码构成了所有索引的单元格(而不仅仅是间隔的开头和结尾):
cell_index=arrayfun(@colon, INDEX(:,1), INDEX(:,2), 'Uniform', false)
然后你应该通过cell2mat
函数将它从单元格转换为矩阵:
mat_index=cell2mat(cell_index)
最后,将索引替换为v
向量:
RESULT=v(mat_index)
答案 2 :(得分:0)
在这种情况下最简单的解决方案是
RESULT=v([INDEX(:,1) INDEX(:,1)+1 INDEX(:,2)])
如果索引数组中的跨度可能包含完全中间索引:
RESULT=v([INDEX(:,1) (INDEX(:,1)+INDEX(:,2))/2 INDEX(:,2)])
为了提供足够的工作和通用解决方案,您应该提供索引矩阵可以具有的约束。