Доступ к значению матрицы с использованием вектора координат?
Допустим, у нас есть вектор:
b = [3, 2, 1];
Допустим, у нас также есть такая матрица:
A = ones([10 10 10]);
Я хочу использовать вектор b
в качестве источника координат для присвоения значений матрице A
, В этом примере это будет эквивалентно:
A(3, 2, 1) = 5;
Есть ли в MALTAB простой способ использовать вектор в качестве источника координат для индексации матрицы?
2 ответа
Вы можете сделать это путем преобразования вашего вектора 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;
Другой способ - преобразовать координаты в линейный индекс, аналогичный функции 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;