是否有可能在没有循环的情况下从另一个向量为矩阵分配多个值?
例如:
我有一个用零填充的矩阵:
matrix=zeros(2);
matrix =
0 0
0 0
现在我有另一个向量,其中前两列是位置,第三列是属于相应位置的值。
values=[2 1 4;1 2 2]
values =
Posx PosY Value
2 1 4
1 2 2
结果应该是:
matrix =
0 2 <-- matrix(values(2,1),values(2,2))=values(2,3) ;
4 0 <-- matrix(values(1,1),values(1,2))=values(1,3);
这并不漂亮,但它只是一行代码:
matrix(size(matrix,1) * (values(:,2) - 1) + values(:,1)) = values(:,3)
我可以把它分成两行,使它更清楚一些。其想法是将values
的前两列转换为一维索引向量,该向量具有与要分配的值一样多的元素,然后分配值:
index = size(matrix,1) * (values(:,2) - 1) + values(:,1)
matrix(index) = values(:,3)
当使用向量对矩阵进行索引时,它会先倒计数列,然后跨行倒计数。为了更清楚,将第一条语句再拆分一些:
numRows = size(matrix,1)
rowIndex = values(:,1)
colIndex = values(:,2)
vals = values(:,3)
index = numRows * (colIndex - 1) + rowIndex
matrix(index) = vals
事实上,您不需要经历构建index
向量的所有麻烦,因为函数sub2ind
的存在就是为您做这件事的:
index = sub2ind(size(matrix), rowIndex, colIndex)
matrix(index) = vals
尽管我认为,为了你自己的教育,打电话给sub2index
看看如何获得结果是件好事。
我制作了一个函数来实现这一点,如果你愿意,你可以使用它:
function B = ndassign( A , varargin )
%%% copy A to B, and assign values to A at specified nd indexes
%%% B=ndind(A,X,Y,Z,V)
%%% ---> B(X(i),Y(i),Z(i))=V(i)
%%% Example:
%%% ndassign(eye(3),[1 2 3],[3 2 1],[4 5 6])
%%% ans =
%%% 1 0 4
%%% 0 5 0
%%% 6 0 1
B=A;
inds=sub2ind(size(A),varargin{1:end-1});
B(inds)=varargin{end};
end