从具有特定索引而没有循环的向量创建矩阵

时间:2018-02-09 00:40:38

标签: matlab matrix vector indexing vectorization

我有一个矢量和这样的矩阵:

v = [0.3 -3 3 -2 7 6]
INDEX = [1 3; 3 5; 4 6]

INDEX是一个矩阵,用于指示v行必须具有的RESULT上的第一个和最后一个元素。我确保INDEX中的每个间隔,即 1 to 33 to 54 to 6具有相同的长度,因此RESULT矩阵中的每一行都具有相同的长度。

我想获得这样的矩阵:

RESULT = [0.3 -3  3; 
            3 -2  7; 
           -2  7  6] 

如果没有for循环,如何执行此操作?

3 个答案:

答案 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)])

为了提供足够的工作和通用解决方案,您应该提供索引矩阵可以具有的约束。