#matlab
#matlab
Вопрос:
Разреженная матрица — это большая матрица, почти все элементы которой имеют одинаковое значение (обычно ноль). Обычное представление разреженной матрицы занимает много памяти, когда полезная информация может быть собрана с гораздо меньшим количеством. Возможный способ представления разреженной матрицы — это вектор ячейки, первым элементом которого является 2-элементный вектор, представляющий размер разреженной матрицы. Второй элемент — это скаляр, задающий значение по умолчанию для разреженной матрицы. Каждый последующий элемент вектора ячейки представляет собой вектор из 3 элементов, представляющий один элемент разреженной матрицы, который имеет значение, отличное от значения по умолчанию. Тремя элементами являются индекс строки, индекс столбца и фактическое значение. Напишите функцию с именем «sparse2matrix», которая принимает один ввод вектора ячейки, как определено выше, и возвращает выходной аргумент с именем «matrix», матрицу в ее традиционной форме. Рассмотрим следующий запуск:
cellvec = {[2 3], 0, [1 2 3], [2 2 -3]};
matrix = 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
Результат этого кода отличается от результата, который я показал выше.
Я не получаю правильного ответа, и, честно говоря, я не знаю, что делать, поэтому я был бы признателен, если бы вы немного помогли мне.
Ответ №1:
Не самый элегантный способ сделать это, но он выполняет свою работу. Использует cell2mat()
функцию и индексацию для получения необходимых значений для каждого шага. Затем для получения векторов из 3 элементов используется цикл 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
Комментарии:
1. Привет! Большое вам спасибо за то, что ответили мне! Я терял надежду, но теперь я чувствую себя немного лучше, потому что кто-нибудь мне помогает. Однако могу ли я задать вопрос? Я не слишком хорошо знаком со всем, что вы использовали здесь, и я хочу понять. Например, мне непонятно, в чем смысл cell2mat(x(1,1)) … Можно ли было бы объяснить, что это за 1,1? Очевидно, вы не обязаны отвечать, может быть, это глупый вопрос для вас, но в случае, если вы захотите, я с нетерпением жду вашего ответа. Надеюсь, у вас будет хороший день.
2. Я добавил небольшое объяснение, надеюсь, это прояснит первые две строки кода.