Хобрук: Ваш путь к мастерству в программировании

Matlab: множественное назначение векторов без цикла

есть ли возможность присвоить несколько значений матрице из другого вектора без цикла?

Например:

У меня есть матрица, заполненная нулями:

matrix=zeros(2);
matrix =

 0     0      
 0     0      

Теперь у меня есть другой вектор, где первые два столбца - это позиции, а третий столбец - это значения, принадлежащие соответствующим позициям.

 values=[2 1 4;1 2 2]
 values =

        Posx PosY   Value
        2     1     4
        1     2     2

Результат должен выглядеть так:

matrix = 
             0     2  <-- matrix(values(2,1),values(2,2))=values(2,3) ;     
             4     0  <-- matrix(values(1,1),values(1,2))=values(1,3);
26.03.2012


Ответы:


1

Это не красиво, но это один лайнер:

matrix(size(matrix,1) * (values(:,2) - 1) + values(:,1)) = values(:,3)

Я могу сделать это немного яснее, разделив его на две строки. Идея состоит в том, что вы преобразуете первые два столбца values в одномерный индексирующий вектор, который имеет столько элементов, сколько значений нужно присвоить, а затем присваиваете значения:

index = size(matrix,1) * (values(:,2) - 1) + values(:,1)

matrix(index) = values(:,3)

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

numRows  = size(matrix,1)
rowIndex = values(:,1)
colIndex = values(:,2)
vals     = values(:,3)
index    = numRows * (colIndex - 1) + rowIndex

matrix(index) = vals

На самом деле вам не нужно мучиться с построением вектора index, так как существует функция sub2ind, которая сделает это за вас:

index = sub2ind(size(matrix), rowIndex, colIndex)

matrix(index) = vals

хотя я думаю, что неплохо посмотреть, как получить результаты с помощью вызова sub2index, для вашего собственного образования.

26.03.2012
  • Привет, Крис, спасибо за ответ, но можешь ли ты объяснить мне, в чем идея строки :index = numRows * (colIndex - 1) + rowIndex? 27.03.2012
  • Спасибо, я нашел ответ сам! 27.03.2012

  • 2

    Я сделал для этого функцию, вы можете использовать ее, если хотите:

    function B = ndassign( A , varargin )
    %%% copy A to B, and assign values to A at specified nd indexes
    %%% B=ndind(A,X,Y,Z,V)
    %%%   ---> B(X(i),Y(i),Z(i))=V(i)
    %%% Example:
    %%% ndassign(eye(3),[1 2 3],[3 2 1],[4 5 6])
    %%% ans =
    %%%      1     0     4
    %%%      0     5     0
    %%%      6     0     1
    
    B=A;
    inds=sub2ind(size(A),varargin{1:end-1});
    B(inds)=varargin{end};
    
    end
    
    26.03.2012
    Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..