我在Matlab中有三个向量,I(整数)、J(整数)和V(二重)。我想给一个矩阵赋值,在位置I_I,J_I,范围在I上,值V_I。
这可能吗?问题是,A(I,J)指的是所有可能的组合(I_I,J_J),而不是匹配向量中的元素。
简单的答案是:
A(sub2ind(size(A),X,Y)) = V
试试看,它很有魅力。
如果你好奇并想要它,解释很简单:
Matlab中的每个矩阵都存储为一维数组,即法向量。
一个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;
sub2in函数将"下标"列表转换为线性索引,给定矩阵的大小。正是你想做的。
有了手头的索引,进行分配就很容易了。
文档:sub2in
Matlab 中的索引
希望我能正确理解你。
我花了很长时间来回答,因为这是Matlab的一个非常重要的部分,很多人使用"向量运算"函数来过度复杂化代码,以完成正常索引可以完成的事情。
尝试使用ACCUMARRAY:
M = accumarray([I(:) J(:)], V(:));
在这种情况下,如果您有I和J的非唯一组合,V中的相应值将被添加在一起(默认函数为@sum
)。如果需要不同的行为,请将函数作为可选参数传递给accumarray
(请参阅文档)。
也许您想使用稀疏矩阵格式?A=稀疏(…)有一个签名,可以用来将(i,j,value)三元组强制转换为A的非零,其中其他条目是结构零(不需要存储)。
如果我探究了这个问题,那就是
我认为它应该是类似于A=稀疏(I,j,v)的东西,剩下的参数将默认为m:=max(I),n:=max(j),nzmax:=length(v),这就是我想你想要的。