Построение взвешенной матрицы в MATLAB с векторами

#matlab #matrix #vector #indexing

#matlab #матрица #вектор #индексирование

Вопрос:

У меня проблема с использованием MATLAB. Я хочу создать огромную матрицу смежности, и для достижения этого результата я написал некоторый код, который генерирует 3 вектора: NodeX , NodeY , и Weight .

NodeX представляет индексы строк матрицы.

NodeY представляет индексы столбцов матрицы.

Weight является вектором, который содержит веса.

Все эти векторы помещаются в .csv файл, который MATLAB очень легко считывает. Но когда я создаю матрицу, у меня возникает проблема. Это код, который я использую для привязки индексов к весам.

     for i=1:1:3873
    WeightedMatrix(NodeY(i), NodeX(i)) = Weight(i);
    end
  

Результаты, которые я вижу, немного странные для меня. На самом деле, если я сделаю:

 WeightedMatrix(NodeY(1), NodeX(1))
  

MATLAB выводит мне:

 ans = 0.2483
  

Это значение, которое присутствует в векторе веса, но это не то значение, которое я хочу.

И если я это сделаю:

 Weight(1)
  

Он возвращает ans = 1.2550 (это значение, которое я хочу).

Эти три вектора, например:

Данные, импортированные из .Csv

Это заключительная часть, которая создает .csv файл:

 tmp = set(Final)
tmp = tuple(tmp)
for z in tmp:
print str(z[0])   ","   str(z[1])   ","   str(z[2])   "n"
  

Комментарии:

1. WeightedMatrix(NodeY(1), NodeX(1)) Разве вы не должны изменять порядок аргументов, если хотите увидеть тот же результат, Weight(1) что и?

2. К сожалению, результат тот же.. Спасибо

3. Я думаю, вам следует поделиться той частью вашего кода, где вы читаете / генерируете три вектора.

4. @erfan Я добавил окончательный код. Если вам нужен весь код, пожалуйста, скажите мне.

5.Если вы можете успешно прочитать все 3 вектора NodeX, NodeY и Weigth, не могли бы вы попробовать это…: WMatrix = zeros(max(NodeX), max(NodeY)); WMatrix(NodeX , NodeY) = Weigth

Ответ №1:

Вы можете сформировать матрицу смежности как разреженную матрицу, чтобы предотвратить проблемы с памятью:

 WeightedMatrix_sp = sparse(NodeX, NodeY, Weight);
  

Если у вас достаточно памяти, вы можете преобразовать разреженную матрицу в плотную матрицу:

 WeightedMatrix = full(WeightedMatrix_sp);
  

Комментарии:

1. Спасибо, но это не проблема памяти, мне удалось получить результаты только с единицами и без весов, но моя проблема состоит в сопоставлении весов с индексами. Спасибо еще раз…

2. @RiccardoCelli если вы хотите единицы вместо весов, пожалуйста, добавьте свое условие к вопросу. вы можете написать : WeightedMatrix =full(sparse(NodeX, NodeY, 1));

3. Нет, мне нужны веса. Проблема не в числах, а в элементах векторного веса. 🙂

4. Я пытался использовать ваш метод, но результат отличается от двух предыдущих, которые я задал в своем вопросе, поэтому я думаю, что в моем случае это не сработает. Большое спасибо.