Извлечение матрицы из вектора ячейки в MATLAB

#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. Я добавил небольшое объяснение, надеюсь, это прояснит первые две строки кода.