Разреженная матрица — это большая матрица, в которой почти все элементы одинаковы. значение (обычно нулевое). Нормальное представление разреженной матрицы занимает много памяти, когда полезная информация может быть захвачена с гораздо меньшим. Возможный способ представить разреженную матрицу с помощью вектор ячейки, первый элемент которого представляет собой двухэлементный вектор, представляющий размер разреженной матрицы. Второй элемент является скаляром, определяющим значение по умолчанию разреженной матрицы. Каждый последующий элемент вектор ячейки представляет собой трехэлементный вектор, представляющий один элемент разреженная матрица, которая имеет значение, отличное от значения по умолчанию. Три элементами являются индекс строки, индекс столбца и фактическое значение. Напишите функцию под названием "sparse2matrix", которая принимает один вход вектор ячейки, как определено выше, и возвращает выходной аргумент, называемый «матрица», матрица в ее традиционной форме. Рассмотрим следующее бегать:
cellvec = {[2 3], 0, [1 2 3], [2 2 -3]};
матрица = sparse2matrix(cellvec)
матрица =
0 3 0
0 -3 0
Всем доброе утро/день/ночь
Мне было интересно, не могли бы вы помочь мне с этим.
Я пытаюсь завершить это, но я не уверен, как с этим справиться. Я понимаю, что меня интересует первая часть вектора ячеек, но я не уверен, как сказать Matlab, что мне это нужно. Это мой код:
function matrix = sparse2matrix(x)
A = [2 3];
B = 0;
C = [1, 2, 3];
x = {A, 0, C};
matrix = cell2mat(x);
end
Результат этого кода отличается от результата, который я показал выше. Я не получаю правильного ответа и, честно говоря, не знаю, что делать, поэтому я был бы признателен, если бы вы немного помогли мне.
Не самый элегантный способ сделать это, но он выполняет свою работу. Использует функцию cell2mat()
и индексирование для получения необходимых значений для каждого шага. Затем цикл for используется для получения трехэлементных векторов, которые используются для изменения значений массива по сравнению со значениями по умолчанию в соответствующих индексах.
cellvec = {[2 3], 0, [1 2 3], [2 2 -3]};
[matrix] = sparse2matrix(cellvec)
function [matrix] = sparse2matrix(x)
Matrix_Size = cell2mat(x(1,1));
Matrix_Height = Matrix_Size(1);
Matrix_Width = Matrix_Size(2);
Default_Value = cell2mat(x(1,2));
matrix = Default_Value*ones(Matrix_Height,Matrix_Width);
Triplets = x(3:end);
Number_Of_Triplets = length(Triplets);
for Triplet_Index = 1: Number_Of_Triplets
Current_Triplet = cell2mat(Triplets(1,Triplet_Index));
Row = Current_Triplet(1,1);
Column = Current_Triplet(1,2);
Value = Current_Triplet(1,3);
matrix(Row,Column) = Value;
end
end
Первая строка в локальной функции sparse2matrix()
указывает на получение строки 1, столбца 1 массива ячеек x
и последующего преобразования его в матрицу. Преобразование выполняется с помощью функции cell2mat()
.
Matrix_Size = cell2mat(x(1,1));
Результат:
Matrix_Size = [2 3]
Следующая строка указывает на получение индекса 1 предыдущего массива Matrix_Size
. Это будет использоваться для определения высоты выходного массива matrix
. Это делается аналогичным образом для оценки Matrix_Width
с использованием индекса 2.
Matrix_Height = Matrix_Size(1);
Результат:
Matrix_Height = 2
Выполнено с использованием MATLAB R2019b
Я добавил небольшое объяснение, надеюсь, это прояснит первые две строки кода.
Привет! Большое спасибо, что ответили мне! Я терял надежду, но теперь я чувствую себя немного лучше, потому что кто-то помогает мне. Однако можно вопрос? Я не слишком знаком со всем, что вы здесь использовали, и я хочу понять. Например, мне непонятно, что означает cell2mat(x(1,1))... Можно ли объяснить, что это за 1,1? Вы можете не отвечать, очевидно, может быть, это глупый вопрос для вас, но в случае, если вы хотите, я с нетерпением жду вашего ответа. Надеюсь, у вас все сегодня хорошо.