我有一个矩阵说
Z = [1 2 3;
4 5 6;
7 8 9]
我必须改变自己的价值观,说在位置(2,2)和(3,1),一些指定的值。 我有两个矩阵rowNos
和colNos
含有这些位置:
rowNos = [2, 3]
colNos = [2, 1]
比方说,我想在这些位置来改变元素的值设置为0。
我如何能做到这一点,而不使用循环?
我有一个矩阵说
Z = [1 2 3;
4 5 6;
7 8 9]
我必须改变自己的价值观,说在位置(2,2)和(3,1),一些指定的值。 我有两个矩阵rowNos
和colNos
含有这些位置:
rowNos = [2, 3]
colNos = [2, 1]
比方说,我想在这些位置来改变元素的值设置为0。
我如何能做到这一点,而不使用循环?
使用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变平由列矩阵(基于列的矩阵存储)。