#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
файл:
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. Я пытался использовать ваш метод, но результат отличается от двух предыдущих, которые я задал в своем вопросе, поэтому я думаю, что в моем случае это не сработает. Большое спасибо.