Есть ли способ оптимизировать мой код для преобразования массива в 2D-систему координат?

Я пытаюсь сделать тепловую карту в Matlab. Значения, переданные из моей программы, хранятся в большом одномерном массиве. Таким образом, 4-й элемент в массиве из 9 элементов будет (1,2), а 9-й точкой будет (3,3). (1,1) будет первым элементом. Значение хранится в каждом элементе.

Оказавшись в Matlab, я хочу преобразовать этот массив в матрицу, чтобы я мог использовать imagesc(), чтобы показать, насколько высок или низок каждый элемент массива в системе координат x, y.

Мой код работает, но я чувствую, что выполнение задачи занимает слишком много времени.

В моем коде x.index — это нижний индекс массива (x.index(1) будет самым первым элементом массива, который выводит код.)

Я передаю общее количество элементов в массиве и извлекаю квадратный корень, чтобы получить границы x и y. Я назвал эту переменную dim.

grid и x — таблицы, содержащие целые числа.

dim = sqrt(x.raycount());
grid = table();

a = zeros(dim,dim)

for i = 1:height(x)
    rem = mod(x.index(i),dim);
    grid.yvalue(i,1) = (x.index(i)-rem)/dim;
    grid.xvalue(i,1) = rem;
    nloc = x.nloc(i)
    grid.nloc(i,1) = nloc;
    a(grid.xvalue(i),grid.yvalue(i)) = grid.nloc(i);
end

person Jacob Shirley    schedule 17.07.2019    source источник
comment
Ваш вопрос/код не очень ясен в отношении его намерения. Вам действительно нужна таблица grid или она просто вспомогательная в процессе получения матрицы a? (Кроме того, является ли nloc целым числом или двойным значением? Если второе, сетка содержит не только целые числа.)   -  person tryman    schedule 17.07.2019
comment
Расширяя комментарий выше, отредактируйте свой вопрос, чтобы уточнить, нужен ли вам grid или нет, не просто отвечайте в комментариях. Кроме того, как примечание, нам всегда легче помочь вам, когда вы предоставляете минимальный и воспроизводимый пример: MRE   -  person tryman    schedule 17.07.2019


Ответы (1)


Предполагая, что вам не нужна таблица grid, и поскольку ваше перечисление является основным столбцом (что касается 9-элементного x, ваш 4-й элемент должен быть назначен в позиции (1,2) матрицы a), вы можете сделать это в одной строке как :

sideLength=sqrt(length(x.nloc));
a = reshape(x.nloc(x.index(x.index)),[sideLength,sideLength]);

Это если вы уверены, что у вас квадратная сетка. Если у вас прямоугольная сетка, используйте [sidelength1,sidelength2] в качестве второго аргумента для изменения формы.

person tryman    schedule 17.07.2019
comment
Спасибо! Я не слышал о функции изменения формы. Мне удалось сократить код до: dim = sqrt(x.raycount(1)); таблица1 = нули (1, x.raycount (1)); для i = 1: высота (x) table1 (x.index (i)) = x.nloc (i); конец a = изменить форму (таблица1, тусклый, тусклый); - person Jacob Shirley; 17.07.2019
comment
Добро пожаловать. Кажется, я неправильно понял, поэтому при линейной индексации индекс получается через x.index. В этом случае попробуйте в качестве одного вкладыша это: sideLength=sqrt(length(x.nloc)); и a = reshape(x.nloc(x.index(x.index)),[sideLength,sideLength]); Если это приемлемо, я включу это в приведенный выше ответ. - person tryman; 17.07.2019
comment
@JacobShirley ответ на ваш вопрос или есть что-то еще? - person tryman; 07.08.2019