Доступ к значению матрицы с использованием вектора координат?

Допустим, у нас есть вектор:

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;
Другие вопросы по тегам