Как я могу присвоить значение диагонали 4-D матрицы с помощью линейного индексирования в MATLAB? - PullRequest
4 голосов
/ 16 марта 2011

У меня 4-D матрица A размера NxNxPxQ.Как я могу легко изменить диагональные значения на 1 для каждой NxN 2-D подматрицы в векторизованном виде?

Ответы [ 3 ]

3 голосов
/ 16 марта 2011

Включая предложение gnovice, простой способ индексирования элементов:

[N,~,P,Q]=size(A);%# get dimensions of your matrix

diagIndex=repmat(logical(eye(N)),[1 1 P Q]);%# get logical indices of the diagonals    
A(diagIndex)=1;%# now index your matrix and set the diagonals to 1.
2 голосов
/ 16 марта 2011

На самом деле вы можете сделать это очень просто, непосредственно вычисляя линейные индексы для каждого диагонального элемента, затем устанавливая их в 1:

[N,N,P,Q] = size(A);
diagIndex = cumsum([1:(N+1):N^2; N^2.*ones(P*Q-1,N)]);
A(diagIndex) = 1;

Приведенный выше пример находит диагональные индексы N для первой N -by- N матрицы (1:(N+1):N^2). Каждая последующая матрица N -by- N (из них P*Q-1) смещается на N^2 элементов от последней, поэтому матрица размером PQ-1 -by- N содержит только значение N^2 добавляется к линейным индексам для диагонали первой матрицы. Когда кумулятивная сумма выполняется для каждого столбца с использованием функции CUMSUM , результирующая матрица содержит линейные индексы для всех диагональных элементов 4-D матрицы.

0 голосов
/ 16 марта 2011

Вы можете использовать прямое индексирование и некоторые ссоры с repmat, чтобы добавить индексы для одной диагонали 50x50 к смещениям в пределах большей матрицы каждого блока 50x50:

Вот пример для меньшей проблемы:

A = NaN(10,10,5,3);
inner = repmat(sub2ind([10 10], [1:10],[1:10]), 5*3, 10); % diagonals
outer = repmat([10*10 * [0:5*3-1]]', 1, 10*10); % offsets to blocks
diags = inner + outer;
A(diags(:)) = 1;
...