假设我们有一个向量:
b = [3, 2, 1];
假设我们也有这样的矩阵:
A = ones([10 10 10]);
我想使用 vectorb
作为坐标源来为 matrix 赋值A
。在此示例中,它将等效于:
A(3, 2, 1) = 5;
MALTAB 中是否有一种简单的方法可以使用向量作为坐标源来索引矩阵?
假设我们有一个向量:
b = [3, 2, 1];
假设我们也有这样的矩阵:
A = ones([10 10 10]);
我想使用 vectorb
作为坐标源来为 matrix 赋值A
。在此示例中,它将等效于:
A(3, 2, 1) = 5;
MALTAB 中是否有一种简单的方法可以使用向量作为坐标源来索引矩阵?
您可以通过将向量b
转换为元胞数组来做到这一点:
B = num2cell(b);
A(B{:}) = 5;
第二行将展开B
为一个逗号分隔的列表,将 的每个元素B
作为单独的数组索引传递。
如果b
包含多个点的坐标(每行代表一个点),您可以将解决方案概括如下:
B = mat2cell(b, size(b, 1), ones(1, size(b, 2)));
A(sub2ind(size(a), B{:}))
这里b
被转换成元胞数组,每个元胞包含同一维度的所有坐标。请注意,这A(B{:})
不会产生我们想要的结果(相反,这将选择左上角和右下角坐标之间的所有元素),因此我们必须执行将坐标转换为线性索引的中间步骤sub2ind
。
直接的方法是:
A(b(1), b(2), b(3)) = 5;
另一种方法是将坐标转换为线性索引,类似于 function 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;