Matlab:没有Loop的向量的多个赋值

时间:2012-03-26 13:40:59

标签: matlab vector

是否有可能在没有循环的情况下从另一个矢量为矩阵分配多个值?

例如:

我有一个用零填充的矩阵:

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);

2 个答案:

答案 0 :(得分:1)

这不是很漂亮,但它只是一个班轮:

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来了解如何获得结果,这对您自己的教育很有好处。

答案 1 :(得分:0)

我做了一个功能,你可以使用它,如果你想:

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