如何在Matlab中分配一组坐标?

时间:2012-03-20 20:38:53

标签: matlab

我在Matlab中有三个向量,I(整数),J(整数)和V(双精度)。 我想分配一个矩阵,位置I_i,J_i,范围超过i,值V_i。

这可能吗? 问题是A(I,J)指的是所有可能的组合(I_i,J_j),而不是匹配向量中的元素。

3 个答案:

答案 0 :(得分:2)

简短的回答是:

 A(sub2ind(size(A),X,Y)) = V

尝试一下,它就像一个魅力。

如果您感到好奇并想要它,那么解释就很容易理解:

Matlab中的每个矩阵都存储为1d数组,即法向量。

实际上,2d数组作为第一列的序列存储在内存中,然后是第二列,依此类推。因此,您可以使用线性下标索引任何与其维度无关的Matlab数组。

例如:

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

实际存储为:

[1 2 3 4 5 6 7 8 9]

所以要访问项目,你所要做的就是:(j-1)* num_of_columns + i

因此,A(2,3)返回与A(8)相同的,即在这种情况下:8;

在给定矩阵大小的情况下,sub2ind函数将“下标”列表转换为线性索引。正是你想要做的。

随着手头的索引,很容易进行分配。

文档: sub2ind

Indexing in Matlab

希望我理解正确。

我花了很长时间来回答这个问题,因为这是Matlab的一个非常重要的部分,很多人使用“矢量操作”函数来复杂化代码来完成可以通过正常索引完成的事情。

答案 1 :(得分:1)

尝试使用ACCUMARRAY

 M = accumarray([I(:) J(:)], V(:));

在这种情况下,如果您有I和J的非唯一组合,则V中的相应值将一起添加(默认功能区为@sum)。如果您需要不同的行为,请将函数作为可选参数传递给accumarray(请参阅documentation)。

答案 2 :(得分:0)

也许你想使用稀疏矩阵格式? A =稀疏(...)有一个签名,可以用来强制你的(i,j,值)三元组变成A的非零,其他条目是结构零(不需要存储)。

如果我理解了这个问题,那就是。

我认为它会像A =稀疏(i,j,v),其余参数将默认为m:= max(i),n:= max(j),nzmax:= length(v) ,这就是我想象你想要的。