как назначить набор координат в Matlab? - PullRequest
0 голосов
/ 21 марта 2012

У меня есть три вектора в Matlab, I (целых чисел), J (целых чисел) и V (двойных).Я хочу присвоить матрице в позициях I_i, J_i, начиная от i, значение V_i.

Возможно ли это?Проблема в том, что A (I, J) ссылается на все возможные комбинации (I_i, J_j) вместо сопоставления элементов в векторе.

Ответы [ 3 ]

2 голосов
/ 21 марта 2012

Короткий ответ таков:

 A(sub2ind(size(A),X,Y)) = V

Попробуйте, это работает как шарм.

Объяснение, если вам любопытно и вы хотите его, просто следовать:

Каждая матрица в Matlab хранится в виде 1d-массива, нормального вектора.

2-мерный массив фактически сохраняется в памяти как последовательность первого столбца, за которым следует второй столбец,и так далее.По этой причине вы можете индексировать любой массив 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;

Функция sub2ind преобразует список «индексов» в линейные индексы, учитывая размер матрицы.Именно то, что вы хотите сделать.

И с указателями под рукой, легко сделать назначение.

Документы: sub2ind

Индексирование в Matlab

Надеюсь, я вас правильно понял.

Я долго отвечал, потому что это очень важная часть Matlab, и МНОГОлюди слишком усложняют код, используя функции «векторного управления», чтобы делать то, что можно сделать с помощью обычной индексации.

1 голос
/ 21 марта 2012

Попробуйте использовать ACCUMARRAY :

 M = accumarray([I(:) J(:)], V(:));

В этом случае, если у вас есть неуникальные комбинации I и J, соответствующие значения в V будут добавлены вместе (функция по умолчанию - @sum). Если вам нужно другое поведение, передайте функцию в качестве необязательного аргумента accumarray (см. Документацию ).

0 голосов
/ 21 марта 2012

Может быть, вы хотите использовать формат разреженной матрицы?A = sparse (...) имеет сигнатуру, которую можно использовать для приведения ваших (i, j, value) троек в ненулевые значения A, где другие записи являются структурными нулями (не требуют хранения).

ЕслиЯ задал вопрос, то есть.

Я думаю, что это будет что-то вроде A = sparse (i, j, v), остальные аргументы по умолчанию будут m: = max (i), n: = max(j), nzmax: = длина (v), это то, что я думаю, вы хотели бы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...