我在Matlab中有三个向量,I(整数),J(整数)和V(双精度)。 我想分配一个矩阵,位置I_i,J_i,范围超过i,值V_i。
这可能吗? 问题是A(I,J)指的是所有可能的组合(I_i,J_j),而不是匹配向量中的元素。
答案 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
希望我理解正确。
我花了很长时间来回答这个问题,因为这是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) ,这就是我想象你想要的。