使用坐标向量访问矩阵值?

时间:2013-05-19 15:59:17

标签: matlab vector multidimensional-array matrix matrix-indexing

假设我们有一个向量:

b = [3, 2, 1];

假设我们也有这样的矩阵:

A = ones([10 10 10]);

我想使用向量b作为坐标源,为矩阵A指定值。在这个例子中,它将等同于:

A(3, 2, 1) = 5;

在MALTAB中有一种简单的方法可以使用矢量作为索引矩阵的坐标源吗?

2 个答案:

答案 0 :(得分:3)

直截了当的方法是:

A(b(1), b(2), b(3)) = 5;

另一种方法是将坐标转换为线性索引,类似于函数sub2ind

idx = [1, cumprod(size(A))] * [b(:) - 1; 0] + 1;
A(idx) = 5;

此解决方案可以进一步扩展到多个点,其坐标存储在b的行中,以及向量vals中指定的值,其长度等于行数b

idx = [1, cumprod(siz(2:end))] * (reshape(b, [], ndims(A)) - 1)' + 1;
A(idx) = vals;

答案 1 :(得分:3)

您可以将矢量b转换为单元格数组:

B = num2cell(b);
A(B{:}) = 5;

第二行会将B扩展为comma-separated list,将B的每个元素作为单独的数组索引传递。

概括

如果b包含多个点的坐标(每行代表一个点),您可以按如下方式推广解决方案:

B = mat2cell(b, size(b, 1), ones(1, size(b, 2)));
A(sub2ind(size(a), B{:}))

此处b转换为单元格数组,每个单元格包含相同维度的所有坐标。请注意A(B{:})将不会产生我们想要的结果(相反,这将选择左上角和右下角坐标之间的所有元素),因此我们必须执行将坐标转换为线性索引的中间步骤与sub2ind