#matlab #sparse-matrix
#matlab #разреженная матрица
Вопрос:
У меня есть разреженный матричный файл, который содержит 820 строк. Пример нескольких строк файла выглядит следующим образом:
0 547 1
1 547 1
2 539 0.500000
2 540 0.500000
3 512 0.333333
3 515 0.333333
Я хочу импортировать этот разреженный матричный файл в Matlab. Полная матрица, содержащаяся в файле, содержит 1184 строки и равное количество столбцов. Чтобы преобразовать этот файл в разреженную матрицу, я использую следующие команды:
T = reshape(T,3,entries)';
disp('Array is: ');
A = (sparse(T(:,1) 1, T(:,2) 1, T(:,3), rows , cols));
Сначала и перед добавлением 1 к индексу отображается сообщение об ошибке, которое:
«??? Ошибка при использовании ==> разреженный индекс в матрице должен быть положительным.
Это было связано с тем, что Matlab начинается с индекса 1, а не с индекса 0.
После добавления 1 проблема будет решена. Но теперь, когда я запускаю этот код
A = (sparse(T(:,1) 1, T(:,2) 1, T(:,3), rows , cols));
Для диагональной матрицы результат отличный, и проблема с положительным индексом решена. Но когда я пробую это для недиагональной матрицы, результатом является то, что она инвертирует выходные данные. Я имею в виду, что вместо того, чтобы иметь (1, 500) = 3,67, это дает мне (500,1) = 3,67. Почему Matlab это делает?
Комментарии:
1. Да, это кажется проблемой, так как после этого я хочу вычислить инвертированный массив, а решение нежелательно. Как вы думаете, в моем коде есть ошибка?
2. @Obito, если вы тратите время на исправление официальных названий программ, по крайней мере, правильно используйте MATLAB .
3. @Adriaan Круто, спасибо.
Ответ №1:
Вероятно, вы следуете основным строкам (например, ваша матрица была создана на C), а MATLAB является основным столбцом. Чтобы преобразовать из одного в другое, просто поменяйте координаты местами!
A = (sparse(T(:,2) 1, T(:,1) 1, T(:,3), cols, rows));
Пример того, что это работает:
T=[0 547 1;
1 547 1;
2 539 0.500000;
2 540 0.500000;
3 512 0.333333;
3 515 0.333333];
% choosen randombly 4x600 because I dont have the full matrix.
% Just use rows and cols in your case
A = sparse(T(:,1) 1, T(:,2) 1, T(:,3), 4 , 600); % this one is as in C
B = sparse(T(:,2) 1, T(:,1) 1, T(:,3), 600 , 4); % this one is my suggestion
isequal(A',B) %the transpose of A is equal to B
Комментарии:
1. Согласно вашему указанию, проблема, к сожалению, все еще остается.
2. @EviPanayiotara что вы имеете в виду? Если вы это сделаете
A(1,500)
, вы получите то же самое, используя мой код или ваш? это невозможно.3. Используя предложенную вами корекцию:
4. @erfan ? Нет. Я не понимаю. Основная строка / столбец не имеет ничего общего с 1. 1 означает только изменение с нулевого индекса на 1 индекс.
5. @erfan Похоже, что это имеет смысл, но если вы подумаете немного дальше, на самом деле это не так. Я пишу код MATLAB для импорта из C. Если я добавлю туда -1, это никак не сработает, весь остальной код — это код MATLAB. Я не пишу целую функцию C для получения индексов MATLAB и передачи их на C, это даже не вопрос OPs.