这与this other question密切相关,但由于性能问题,该问题希望避免sub2ind
。我更关心使用sub2ind
的“不雅”。
假设我想创建另一个MxN矩阵,除了我想从向量中的相应条目分配的每列中的一个条目外,它都是零,并且每列中的行的选择基于另一个向量。例如:
z = zeros(10,4);
rchoice = [3 1 8 7];
newvals = [123 456 789 10];
% ??? I would like to set z(3,1)=123, z(1,2)=456, z(8,3)=789, z(7,4)=10
我可以使用sub2ind
来完成此操作(我在an answer to a closely related question中使用):
z(sub2ind(size(z),rchoice,1:4)) = newvals
但还有另一种选择吗?似乎逻辑寻址可以以某种方式使用,但我很难过,因为为了将逻辑矩阵的元素设置为1,您处理的元素位置与您实际想要处理的矩阵中的元素位置相同。 / p>
答案 0 :(得分:2)
您可以将以前列中的行数添加到rchoice
以直接获取线性索引。
nRows = size(z,1); %# in case you don't know this already
nCols2write = length(newvals);
z(rchoice+[0:nRows:(nRows*(nCols2write-1)]) = newvals;
答案 1 :(得分:2)
有一种很多更简单的方法。
nCols=size(z,2);
z(rchoice,1:nCols)=diag(newvals);