Почему индексы разреженного недиагонального массива инвертируются?

#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.