Как мне заполнить матрицу вектором, рассматривая матрицу как диаграмму и вектор как линию - PullRequest
0 голосов
/ 06 июня 2019

Рассмотрим следующие значения

result=zeros(11,11);
line=(4:0.4:8);

Представьте результат в виде диаграммы X-Y 11x11. Итак, изначально у нас есть чистый лист бумаги. Как и на графике диаграммы, я хочу заполнить значения строки в матрице результатов, чтобы при отображении матрицы мы получали наклонную линию вверх.

Рассмотрим следующую цифру, которую я хочу получить.

enter image description here

Здесь матрицу результатов можно визуализировать как диаграмму с источником в нижнем левом углу. Теперь для X = 1 строка (1) = 4; для X = 2 строка (2) = 4.4, .. и т. д.

Я написал следующий код, который служит цели.

result=zeros(11,11);
line=(4:0.4:8);

for i=1:length(line)
    temp=floor(line(i));
    result(length(line)-temp+1,i)=line(i);
end

Есть ли более эффективный способ реализации этого решения? (Я буду работать с матрицей 20000x20000, поэтому метод должен быть быстрым)

Как предлагается в комментариях, описание проблемы выглядит следующим образом:

Допустим, 1000 строк. Все эти линии имеют разные наклоны и точки пересечения. Я знаю диапазон x линий и диапазон y линий. Из данных я могу извлечь не так уж много, если я нанесу эти линии одновременно на одном графике. Полученное изображение будет примерно таким:

enter image description here

Об этом сюжете можно сделать немного. Однако, если я смогу сохранить эту информацию в большой матрице, тогда я смогу проанализировать, где проходит максимальное количество линий при определенном X-индексе, и соответственно провести дальнейший анализ.

Подробнее

Я дискретизирую ось Y на 1000 равных интервалов: Пример кода следующим образом:

range=max(data)-min(data);
percent=0.20;
outerRange= max(data)+range*percent - (min(data)-range*percent);
outerRangeValues=min(data)-range*percent:outerRange/1000:max(data)+range*percent;

Даже если вполне возможно, что особенно крутая линия пройдет через 2 или более строк в одном столбце, я выберу только одну из строк, которые будут заполнены строкой в ​​одном столбце. Это можно сделать, взяв среднее значение строк для определенного столбца и присвоив одной строке его значение для этого столбца

1 Ответ

4 голосов
/ 06 июня 2019

Вы можете использовать sub2ind, чтобы сохранить векторизацию и избежать циклов.

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

Для оси X это просто, это просто один на столбец, поэтому индексы X будут 1,2,3,...,np.

Для оси Y необходимо поместить значения line в сетку Y. Поскольку индексы должны быть целыми числами, вы должны преобразовать значения с плавающей запятой в целые числа. Для этого вы можете выбрать между round, floor и ceil. Каждый из них будет размещать некоторые значения немного по-своему, вам решать, какой метод округления имеет смысл для вашей проблемы.

Получив свои индексы [row_indices,column_indices], вы преобразуете их в линейные индексы в матрицу с помощью sub2ind, а затем присваиваете значения line этим линейным индексам.

В коде:

line=(4:0.4:8);                     % your input (line vector)

np = numel(line) ;                  % determine size of matrix/chart

% identify column and row indices to modify
idCol = 1:np ;
idRow = fliplr( round( line ) ) ;   % choose "round", "floor" or "ceil"

% build the result
result              = zeros(np);
linearInd           = sub2ind( [np,np], idRow, idCol ) ;
result(linearInd)   = line ;

Дает вам:

>> result
result =
0   0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   7.2 7.6 8
0   0   0   0   0   0   6.4 6.8 0   0   0
0   0   0   5.2 5.6 6   0   0   0   0   0
0   4.4 4.8 0   0   0   0   0   0   0   0
4   0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0   0   0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...