在Matlab中将列插入矩阵

Hyu*_*Lee 4 matlab matrix-indexing

我想将列插入矩阵,但矩阵内的插入列位置因行而异.如何在不使用for循环的情况下执行此操作?

以下是MATLAB中的简化示例; 从A,X,P,我想在不使用for循环的情况下获得APX.

>> A = zeros(4,5)     % inclusive matrix   

 A =  
     0    0    0    0    0  
     0    0    0    0    0  
     0    0    0    0    0  
     0    0    0    0    0  

>> X = [9,8;5,7;8,3;6,7]   % data to insert  

  X =  
   9   8  
   5   7   
   8   3  
   6   7  

>> P = [3;2;4;1]  % insertion position within the matrix  

P =  
   3  
   2  
   4  
   1  

>> APX = [0,0,9,8,0;0,5,7,0,0;0,0,0,8,3;6,7,0,0,0]   % what I want  

  APX =  
   0   0   9   8   0  
   0   5   7   0   0  
   0   0   0   8   3  
   6   7   0   0   0  
Run Code Online (Sandbox Code Playgroud)

ray*_*ica 6

它只是确定正确的列主要索引来访问矩阵,因此您可以使用所需的值填充它.首先需要生成正确的行和列值以访问正确的位置,APX以便您可以使用X这些位置来填充这些位置.

使用时P,每个元素都会告诉您应该为每一行开始填充哪一列X.您需要按递增顺序生成列索引,最多可以生成列数X.要生成行索引,只需创建一个矩阵,该矩阵的大小与X每列从0到最多的行数(与X减1(即0:size(X,2)-1))相同.此矩阵为您提供正确的偏移量,以便您可以P使用此矩阵进行添加.一旦你这样做,你将有一个列索引矩阵,告诉你每个元素应该与每行的输出矩阵的列有关P.最后,利用sub2ind生成使用上面生成的行和列放置列主要股指XAPX.

换一种说法:

P = [3;2;4;1];
X = [9,8;5,7;8,3;6,7];

rowInd = repmat((1:size(X,1)).', 1, size(X,2)); %'
colInd = bsxfun(@plus, P, 0:size(X,2)-1);
APX = zeros(size(X,1), max(colInd(:)));
APX(sub2ind(size(APX), rowInd, colInd)) = X;
Run Code Online (Sandbox Code Playgroud)

为了生成行位置,我们使用repmat创建一个矩阵,其大小与X每列跨越1到最多行的大小相同X.为了生成列位置,我们使用bsxfun创建矩阵,其中每列是向量,P但每列增加1.然后我们创建APX兼容的大小然后sub2ind用来最终填充矩阵.

通过上面的测试输入,我们得到:

APX =

     0     0     9     8     0
     0     5     7     0     0
     0     0     0     8     3
     6     7     0     0     0
Run Code Online (Sandbox Code Playgroud)

次要说明

在尝试向量化之前,你真的应该尝试使用循环.虽然在以前版本的MATLAB中使用循环很慢,但MATLAB R2015b有一个改进的JIT引擎,其中循环现在具有竞争力.在切换到矢量化实现之前,您应该使用循环计算代码并确保它是合理的.