在 Matlab 中将列插入矩阵
Inserting columns to a matrix in Matlab
我想向矩阵中插入列,但矩阵中插入列的位置因行而异。如果不使用 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
to create a matrix that is the same size as X
where each column spans from 1 up to as many rows as X
. To generate the column locations, we use 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 引擎,循环现在具有竞争力。在切换到矢量化实现之前,您应该使用循环为代码计时并确保它是合理的。
我想向矩阵中插入列,但矩阵中插入列的位置因行而异。如果不使用 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
to create a matrix that is the same size as X
where each column spans from 1 up to as many rows as X
. To generate the column locations, we use 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 引擎,循环现在具有竞争力。在切换到矢量化实现之前,您应该使用循环为代码计时并确保它是合理的。