2

我有一个矩阵说

Z = [1 2 3;
     4 5 6;
     7 8 9]

我必须将其值(例如位置 (2,2) 和 (3,1))更改为某个指定值。我有两个矩阵rowNoscolNos其中包含这些位置:

rowNos = [2, 3]
colNos = [2, 1]

假设我想将这些位置的元素值更改为 0。

不使用 for 循环怎么办?

4

3 回答 3

6

使用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;
于 2012-09-06T07:00:53.350 回答
2

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
于 2012-09-06T07:00:38.203 回答
1

你想这样做

z(rowNos, colNos)

但你不能 - MATLAB 对索引进行笛卡尔积。你可以做到这一点

idx=(colNos-1)*size(z, 1)+rowNos;
z(idx)=0

展平 z 矩阵并通过线性索引访问它,该索引是 rowNos 和 colNos 的组合。请记住,MATLAB 按列展平矩阵(基于列的矩阵存储)。

于 2012-09-06T07:02:51.590 回答