matlab - 在 Matlab 中将列插入矩阵

标签 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  

最佳答案

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

使用 P,每个元素都会告诉您应该从哪一列开始填充 X 的每一行。您将需要按递增顺序生成列索引,直到与 X 中的列数一样多。要生成行索引,只需创建一个与 X 大小相同的矩阵,其中每列从 0 到 X 中的行数减 1(即 0:size(X,2)-1)。该矩阵为您提供了正确的偏移量,以便您可以获取 P 并将其与该矩阵相加。执行此操作后,您将拥有一个列索引矩阵,该矩阵具体告诉您每个元素相对于 P 的每行输出矩阵的列的位置。最后,使用 sub2ind使用上面生成的行和列生成列主索引,将 X 放入 APX

换句话说:

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;

为了生成行位置,我们使用 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

小注

在尝试矢量化之前,您真的应该尝试使用循环。尽管在以前版本的 MATLAB 中使用循环很慢,但 MATLAB R2015b 改进了 JIT 引擎,循环现在具有竞争力。在切换到矢量化实现之前,您应该使用循环对代码计时并确保它是合理的。

关于matlab - 在 Matlab 中将列插入矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37131096/

相关文章:

matlab - 向量作为矩阵中的列索引

r - 类似于 R 在 Matlab 中的 rep 的功能

matlab - MATLAB 中的霍夫变换

matlab - 是否可以组装几个选项并传递给matlab中的绘图函数

arrays - 线性索引,逻辑索引等

matlab - 在 MATLAB 中什么时候通过引用赋值?

matlab - 具有各种维度字段的结构的逻辑索引

matlab - 默认的 MATLAB 颜色顺序是什么?

c++ - C++ 中的 Matlab 类型转换

matlab - 将向量分成预定义大小的组