Компактная нотация индексирования матриц MATLAB

Я бы попытался создать комбинированный уникальный ключ для электронной почты и псевдонима.

CREATE UNIQUE INDEX some_index_name ON user_table(email , nickname)

. Редактировать: Чтобы учесть комментарии ниже, мы должны также создать еще 2 уникальных индекса для электронной почты и имени пользователя, чтобы уверен, что 2 пользователя с отдельными электронными письмами могут использовать одно имя пользователя и наоборот.

8
задан gnovice 1 May 2010 в 20:13
поделиться

2 ответа

Если вы хотите избежать использования цикла for, это, вероятно, самый чистый способ сделать это:

indexCell = num2cell(indexmatrix, 1);
linearIndexMatrix = sub2ind(size(kDimensionalMatrix), indexCell{:});
finalTable = kDimensionalMatrix(linearIndexMatrix);

Первая строка помещает каждый столбец indexmatrix в отдельные клетки массива клеток с использованием num2cell . Это позволяет нам передавать все столбцы k в виде списка , разделенных запятыми , в sub2ind , функцию, которая преобразует индексы с индексами (строка, столбец и т. д.) в линейные индексы (каждый матричный элемент пронумерован от 1 до N , N является общим числом элементов в матрице). Последняя строка использует эти линейные индексы для замены вашего цикла for. Хорошее обсуждение матричного индексирования (подстрочный, линейный и логический) можно найти здесь здесь .

Еще немного пищи для размышлений ...

Тенденция отклоняться от циклов for в пользу векторизованных решений - это то, к чему привыкли многие пользователи MATLAB (включая меня). Тем не менее, новые версии MATLAB обрабатывают циклы гораздо эффективнее. Как обсуждалось в , этот ответ на другой вопрос SO, использование циклов for может иногда приводить к более быстрому выполнению кода, чем если бы вы использовали векторизованное решение.

Я, конечно, НЕ говорю, что вам не следует пытаться чтобы векторизовать ваш код больше, только то, что каждая проблема уникальна. Векторизация будет часто более эффективной, но не всегда . Для вашей проблемы скорость выполнения циклов for и векторизованного кода, вероятно, будет зависеть от того, насколько велики значения n и k .

Тем не менее, новые версии MATLAB обрабатывают циклы гораздо эффективнее. Как обсуждалось в , этот ответ на другой вопрос SO, использование циклов for может иногда приводить к более быстрому выполнению кода, чем если бы вы использовали векторизованное решение.

Я, конечно, НЕ говорю, что вам не следует пытаться чтобы векторизовать ваш код больше, только то, что каждая проблема уникальна. Векторизация будет часто более эффективной, но не всегда . Для вашей проблемы скорость выполнения циклов for и векторизованного кода, вероятно, будет зависеть от того, насколько велики значения n и k .

Тем не менее, новые версии MATLAB обрабатывают циклы гораздо эффективнее. Как обсуждалось в , этот ответ на другой вопрос SO, использование циклов for может иногда приводить к более быстрому выполнению кода, чем если бы вы использовали векторизованное решение.

Я, конечно, НЕ говорю, что вам не следует пытаться чтобы векторизовать ваш код больше, только то, что каждая проблема уникальна. Векторизация будет часто более эффективной, но не всегда . Для вашей проблемы скорость выполнения циклов for и векторизованного кода, вероятно, будет зависеть от того, насколько велики значения n и k .

использование циклов for может иногда приводить к более быстрому выполнению кода, чем если бы вы использовали векторизованное решение.

Я, конечно, НЕ говорю, что вам больше не следует пытаться векторизовать свой код, только то, что каждая проблема уникальна. Векторизация будет часто более эффективной, но не всегда . Для вашей проблемы скорость выполнения циклов for и векторизованного кода, вероятно, будет зависеть от того, насколько велики значения n и k .

использование циклов for может иногда приводить к более быстрому выполнению кода, чем если бы вы использовали векторизованное решение.

Я, конечно, НЕ говорю, что вам больше не следует пытаться векторизовать свой код, только то, что каждая проблема уникальна. Векторизация будет часто более эффективной, но не всегда . Для вашей проблемы скорость выполнения циклов for и векторизованного кода, вероятно, будет зависеть от того, насколько велики значения n и k .

15
ответ дан 5 December 2019 в 08:00
поделиться

Чтобы рассматривать элементы вектора indexmatrix (row,:) как отдельные индексы, вам нужно, чтобы элементы были массивом ячеек. Таким образом, вы можете сделать что-то вроде этого

subsCell = num2cell( indexmatrix( row, : ) );
finalTable( row ) = kDimensionalMatrix( subsCell{:} );

Чтобы развернуть subsCell в виде списка, разделенного запятыми, к сожалению, вам нужны две отдельные строки. Однако этот код не зависит от k .

6
ответ дан 5 December 2019 в 08:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: