我有一个矩阵说
Z = [1 2 3;
4 5 6;
7 8 9]
我必须将其值(例如位置 (2,2) 和 (3,1))更改为某个指定值。我有两个矩阵rowNos
,colNos
其中包含这些位置:
rowNos = [2, 3]
colNos = [2, 1]
假设我想将这些位置的元素值更改为 0。
不使用 for 循环怎么办?
我有一个矩阵说
Z = [1 2 3;
4 5 6;
7 8 9]
我必须将其值(例如位置 (2,2) 和 (3,1))更改为某个指定值。我有两个矩阵rowNos
,colNos
其中包含这些位置:
rowNos = [2, 3]
colNos = [2, 1]
假设我想将这些位置的元素值更改为 0。
不使用 for 循环怎么办?
使用sub2ind,它会将您的子索引转换为线性索引,这是一个指向矩阵中一个确切位置的数字(更多信息)。
Z = [ 1 2 3 ; 4 5 6 ; 7 8 9];
rowNos = [2, 3];
colNos = [2, 1];
lin_idcs = sub2ind(size(Z), rowNos, colNos)
如果要对特定行和列上的所有元素(即更高维度的元素)进行操作,还可以使用线性索引来处理它们。计算它们只会变得有点棘手:
Z = reshape(1:4*4*3,[4 4 3]);
rowNos = [2, 3];
colNos = [2, 1];
siz = size(Z);
lin_idcs = sub2ind(siz, rowNos, colNos,ones(size(rowNos))); % just the first element of the remaining dimensions
lin_idcs_all = bsxfun(@plus,lin_idcs',prod(siz(1:2))*(0:prod(siz(3:end))-1)); % all of them
lin_idcs_all = lin_idcs_all(:);
Z(lin_idcs_all) = 0;
对 sub2ind 进行一些实验,并逐步通过我的代码来理解它。
如果它是您想要删除所有元素的第一个维度,那会更容易,那么您可以使用冒号运算符:
Z = reshape(1:3*4*4,[3 4 4]);
rowNos = [2, 3];
colNos = [2, 1];
siz = size(Z);
lin_idcs = sub2ind(siz(2:end),rowNos,colNos);
Z(:,lin_idcs) = 0;
sub2ind
与行和列的多个条目一起使用
Z(sub2ind(size(Z), rowNos, colNos))=0
示例:
Z = [1 2 3;
4 5 6;
7 8 9];
rowNos = [2, 3];
colNos = [2, 1];
Z(sub2ind(size(Z), rowNos, colNos))=0
Z =
1 2 3
4 0 6
0 8 9
你想这样做
z(rowNos, colNos)
但你不能 - MATLAB 对索引进行笛卡尔积。你可以做到这一点
idx=(colNos-1)*size(z, 1)+rowNos;
z(idx)=0
展平 z 矩阵并通过线性索引访问它,该索引是 rowNos 和 colNos 的组合。请记住,MATLAB 按列展平矩阵(基于列的矩阵存储)。